所以我有一个卡片 View 的recyclerview列表。我试图在用户单击卡片时更新每个 View 中的文本时间文本,然后在时间过去时将其重置回来。我在 recyclerviewadapter 中设置了一个内部方法,但是当我调用 updateTimes (从 fragment 调用)时,它不会重置文本。有人可以指导我做错了什么吗?
import java.util.ArrayList;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.net.Uri;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.view.LayoutInflater;
import java.util.Calendar;
import android.content.Intent;
import java.text.SimpleDateFormat;
import java.util.Locale;
public class RecyclerAdapter extends RecyclerView.Adapter<FaucetHolder> {
private ArrayList<Faucet> faucets;
private Context context;
private SharedPreferences sharedPref;
private String dateFormat = "h:mm a";
public RecyclerAdapter(ArrayList<Faucet> faucetsI, Context context) {
this.faucets = faucetsI;
this.context = context;
}
@Override
public FaucetHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_view, viewGroup, false);
FaucetHolder f = new FaucetHolder(v);
return f;
}
@Override
public void onBindViewHolder(FaucetHolder f, int k) {
final Faucet faucet = faucets.get(k);
f.titleText.setOnClickListener(new View.OnClickListener() {
public void onClick(View btn) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(faucet.getLink()));
setRenewal(faucet);
notifyDataSetChanged();
context.startActivity(intent);
}
});
f.titleText.setText(faucet.getName());
sharedPref = context.getSharedPreferences("myPref", 0);
String time = sharedPref.getString(faucet.getSPName(), "could not retrieve time");
Log.e("tree", time);
f.timeText.setText(time);
}
@Override
public int getItemCount() {
return faucets.size();
}
private void setRenewal(Faucet g) {
sharedPref = context.getSharedPreferences("myPref", 0);
SharedPreferences.Editor edit = sharedPref.edit();
Calendar c = Calendar.getInstance();
long current = c.getTimeInMillis();
String x = sharedPref.getString(g.getSPName(), null);
long future = current + g.getLength();
g.setCT(future);
c.setTimeInMillis(future);
SimpleDateFormat df = new SimpleDateFormat(dateFormat, Locale.US);
String date = df.format(c.getTime());
edit.putString(g.getSPName(), date).commit();
}
public void updateTimes() {
sharedPref = context.getSharedPreferences("myPref", 0);
SharedPreferences.Editor edit = sharedPref.edit();
for ( Faucet f : faucets ) {
boolean m = checkifPast(f);
if ( m == true ) {
edit.putString(f.getSPName(), "Ready!").commit();
}
}
notifyDataSetChanged();
}
private boolean checkifPast(Faucet f) {
Calendar c = Calendar.getInstance();
long comp = c.getTimeInMillis();
if ( comp > f.getCT() ) {
return false;
}
return true;
}
}
fragment 代码
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
v = inflater.inflate(R.layout.faucetcards, container, false);
r = (RecyclerView) v.findViewById(R.id.RecyclerView);
rA = new RecyclerAdapter(generateCards(), getActivity());
lm = new LinearLayoutManager(getActivity());
r.setAdapter(rA);
r.setLayoutManager(lm);
sharedPref = getActivity().getPreferences(0);
return v;
}
@Override
public void onResume()
{
rA.updateTimes();
super.onResume();
}
最佳答案
notifyDataSetChanged
应该用作最后的手段,因为它没有指定发生了什么,因此适配器假设没有任何内容不再有效,这会导致列表不仅重新绑定(bind),而且还会重新布局所有内容可见的意见。在您的情况下,您应该使用 notifyItem[Range][Inserted|Changed|Removed]()
方法之一 notifyItemChanged(int position)就可以了。
在 updateText()
中,您编辑文本,但不将结果存储在任何字段中。然后,将调用 bindViewHolder()
,它会调用 setText(getTime())
并将文本重置为其之前的值。这可能就是为什么没有改变的原因。您应该向 ViewHolder 添加一个方法,该方法首先存储结果,然后调用 TextView.setText()。
如果您的 onClick()
从未被调用,您可能需要检查是否已在其布局文件中将 View 设置为可聚焦和可点击。
这是我在 StackOverflow 上的第一个遮阳篷,英语不是我的母语,所以如果我输入错误,请原谅。
关于android - 更新卡片 View 列表中的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30688651/