#android #android-recyclerview #android-cardview #cardview
#Android #android-recyclerview #android-cardview #cardview
Вопрос:
У меня есть recyclerview с cardview, который динамически генерируется на основе ArrayList, заданного в качестве входных данных для RecyclerViewAdpater, который я извлекаю из общих настроек (которые я сохранил ранее в коде). У меня есть метод run() для непрерывного обновления и сохранения ArrayList в общих настройках. Теперь я хотел бы автоматически обновлять cardview на основе обновленного ArrayList в общих настройках. Я попытался вызвать runOnUiThread при передаче списка в RecyclerViewAdapter, но приложение продолжает сбой. Также не уверен, как я могу реализовать notifydatasetchanged для непрерывного обновления, поскольку я знаю, что это можно сделать при нажатии на CardView. Поскольку я впервые работаю над cardview, поскольку мне нужно показать ImageView и пару TextViews, не уверен, возможно ли это с любыми другими представлениями. Так возможно ли это или есть какой-либо другой эффективный способ добиться этого с помощью собственного кода?
public class TestCode extends AppCompatActivity {
List<BtnHandle> BtnHndl ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.myactivity);
final Context myCt = this;
BtnHndl = new ArrayList<>();
SharedPreferences prefs = getSharedPreferences("sharedpref", MODE_PRIVATE);
String BtnData = prefs.getString("btndata", "No name defined");
JSONObject obj = null;
JSONArray jsonArray = null;
try {
obj = new JSONObject(BtnData);
jsonArray = obj.getJSONArray("response");
} catch (JSONException e) {
e.printStackTrace();
}
for (int i = 0; i < jsonArray.length(); i ) {
try {
JSONObject value = jsonArray.getJSONObject(i);
String value1 = value.getString("val1");
String value2 = value.getString("val2");
String value3 = value.getString("val3");
BtnHn.add(new BtnHandle(value1,value2,value3));
} catch (JSONException e) {
e.printStackTrace();
}
}
RecyclerView rv = (RecyclerView) findViewById(R.id.recyclerview_id);
RecyclerViewAdapter myAdapter = new RecyclerViewAdapter(myCt,BtnHndl);
rv.setLayoutManager(new GridLayoutManager(myCt,3));
rv.setAdapter(myAdapter);
}
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {
private Context mContext ;
private List<BtnHandle> mData ;
Listenr mListn;
public static interface Listenr{
public void onClick(int postn);
}
public void setListener(Listenr listener){
mListn = listener;
}
public RecyclerViewAdapter(Context mContext, List<BtnHandle> mData) {
this.mContext = mContext;
this.mData = mData;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view ;
LayoutInflater mInflater = LayoutInflater.from(mContext);
view = mInflater.inflate(R.layout.cardview,parent,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
holder.value1.setText(mData.get(position).getValue1());
holder.value2.setText(mData.get(position).getValue2());
holder.value3.setText(mData.get(position).getValue3());
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
@Override
public int getItemCount() {
return mData.size();
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
TextView value1;
TextView value2;
TextView value3;
CardView cardView ;
public MyViewHolder(View itemView) {
super(itemView);
value1 = (TextView) itemView.findViewById(R.id.value1) ;
value2 = (TextView) itemView.findViewById(R.id.value2) ;
value3 = (TextView) itemView.findViewById(R.id.value3) ;
}
}
}
Комментарии:
1. Я рекомендую вам Google
observer pattern
и то, как он обычно используется в Android:LiveData
иRxJava
2. Конечно, я проверю. Спасибо.
Ответ №1:
Создайте адаптер без списка в качестве аргумента (инициализируйте адаптер только один раз). Создайте в адаптере метод с именем setAdapterItems — inside, очистите внутренний список, добавьте новый список и вызовите notifyDataSetChanged .
Комментарии:
1. Спасибо, я попробовал, как вы упомянули, и вызвал setAdapterItems из activity для MyAdapter, представление генерируется один раз, но оно не обновляется. Я попытался обновить список с помощью new Runnable (), но приложение продолжает сбой.