2

所以我有一个recyclerview列表的卡views.I试图更新每个视图中的文本时间文本,当用户单击卡时,然后重置它回来时间已过去。我在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; 
} 

} 

片段代码

@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(); 
} 
+0

看着这更多,看起来您使用共享偏好来检索您的更新文本。在你的setRenewal方法中,你可以获得首选项,编辑它并放置字符串。但是你没有应用apply()或commit()它,这样你的共享偏好就会被更新。 – Darxval

+0

谢谢。更新后的代码和新问题 –

+0

新问题是什么? – Darxval

回答

4

notifyDataSetChanged应作为最后的手段,因为它没有指定发生了什么事,因此适配器asumes什么是有效的了,这会导致列表不仅重新绑定,还会重新展示所有可见的视图。你应该改为使用notifyItem[Range][Inserted|Changed|Removed]()方法之一,而你的情况notifyItemChanged(int position)会做。

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

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

这是我在StackOverflow上的第一个awnser,英文不是我的第一语言,所以如果我输入了错误的话,请原谅。

+0

点击被称为,但文本没有更新 –

+0

我已经更新了我的awnser可能的原因。 –

+0

现在更新代码n新问题 –

0

两件事情,

  • 我不能看到您的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!"); 
    } 
} 
相关问题