所以我有一个卡片视图的回收列表,当用户点击卡片时,我尝试更新每个视图中的文本时间文本,然后在时间过去时重新设置它。我在循环视图适配器中设置了一个内部方法,但是当我调用updateTimes (从片段调用)时,它不会重新设置文本。有人能告诉我我做错了什么吗?
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;
}
}破片码
@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();
}发布于 2015-06-07 12:45:17
notifyDataSetChanged应该作为最后手段使用,因为它没有指定发生了什么,因此适配器不再有效,这导致列表不仅重新绑定,而且中继所有可见的视图。相反,您应该使用notifyItem[Range][Inserted|Changed|Removed]()方法之一,在您的情况下,notifyItemChanged(int位置)可以。
在updateText()中,您编辑文本,但不要将结果存储在任何字段中。然后,调用bindViewHolder(),它调用setText(getTime())并将文本重置为以前的值。这可能就是为什么什么都没有改变。应该向ViewHolder中添加一个方法,该方法首先存储结果,然后调用TextView.setText()。
如果您的onClick()从未被调用,您可能需要检查是否在其布局文件中设置了可聚焦和可点击的视图。
这是我在StackOverflow上的第一篇文章,英语不是我的第一种语言,所以如果我打错了什么东西,请原谅。
发布于 2015-06-07 03:51:56
两件事,
updateText是在哪里被调用的。notifyDataSetChanged()来更新适配器,让适配器重新绘制列表。我添加了一个简单的回收视图,并在一个textView中添加了一个侦听器。它应该在您调用文本更新之后工作,然后调用notifyDataSetChanged(),请参见下面的
public class MyRecyclerAdapter extends RecyclerView.Adapter<FeedListRowHolder> {
private List<FeedItem> feedItemList;
private Context mContext;
public MyRecyclerAdapter(Context context, List<FeedItem> feedItemList) {
this.feedItemList = feedItemList;
this.mContext = context;
}
@Override
public FeedListRowHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_row, null);
FeedListRowHolder mh = new FeedListRowHolder(v);
return mh;
}
@Override
public void onBindViewHolder(FeedListRowHolder feedListRowHolder, int i) {
final FeedItem feedItem = feedItemList.get(i);
feedListRowHolder.title.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
updateText(feedItem);
notifyDataSetChanged();
}
});
Picasso.with(mContext).load(feedItem.getThumbnail())
.error(R.drawable.placeholder)
.placeholder(R.drawable.placeholder)
.into(feedListRowHolder.thumbnail);
feedListRowHolder.title.setText(Html.fromHtml(feedItem.getTitle()));
}
@Override
public int getItemCount()
{
return (null != feedItemList ? feedItemList.size() : 0);
}
private void updateText(FeedItem feedItem)
{
feedItem.setTitle("TEST!");
}
}https://stackoverflow.com/questions/30688651
复制相似问题