更新卡片视图列表中的文本?

Update text within card view list?

所以我有一个卡片的 recyclerview 列表 views.I 我正在尝试在用户单击卡片时更新每个视图中的文本时间文本,然后在时间过去后将其重置。我在 recyclerviewadapter 中设置了一个内部方法,但是当我调用 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();
}

两件事,

  • 我实际上并没有看到你的 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!");
    }
}

notifyDataSetChanged 应该作为最后的手段使用,因为它没有指定发生了什么,因此适配器认为没有任何东西是有效的,这导致列表不仅重新绑定,而且重新布局所有可见的意见。您应该改为使用 notifyItem[Range][Inserted|Changed|Removed]() 方法之一,在您的情况下 notifyItemChanged(int position) 就可以了。

updateText() 中编辑文本,但不将结果存储在任何字段中。然后稍后,将调用 bindViewHolder(),它调用 setText(getTime()) 并将文本重置为其先前的值。这可能就是为什么什么都没有改变的原因。您应该向 ViewHolder 添加一个方法,该方法首先存储结果然后调用 TextView.setText().

如果您的 onClick() 从未被调用,您可能需要检查是否已在其布局文件中将视图设置为可聚焦和可点击。

这是我在 Whosebug 上的第一个 awnser,英语不是我的母语,如果我打错了,请原谅。