android - 更新卡片 View 列表中的文本?

标签 android android-fragments android-cardview android-recyclerview

所以我有一个卡片 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/

相关文章:

Android EditText Gmail 喜欢字段

Fragment中Android getSupportFragmentManager NULL指针异常

android - 当应用程序在后台时,ViewPager fragment 被破坏?

android - CardViews 之间的差距在滚动时增加

android - 如果互联网连接是错误的,它应该等待连接

android - 如何检查数组是否包含特定术语 - Android

android - 在 AsyncTask 中使用等待

android - fragment 中的 setContentView

android - Cardview - 卡片周围的白色边框

java - RecyclerView onClick 获取项目的位置