- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个使用自定义适配器的回收器 View 。我在自定义适配器上有一个按钮,单击时可以从数据库中删除一行。这工作正常,但我现在希望 View 从服务器更新并向用户展示他们删除的行。我将在下面发布的代码不会给出任何错误,但无法正确刷新。我也会附上我的类(class)和适配器。谢谢。
MyReviews.Java
public class MyReviews extends AppCompatActivity {
private ArrayList reviewername;
private ArrayList reviewscore;
private ArrayList reviewerpic;
private ArrayList reviewdate;
private ArrayList reviewtext;
private ArrayList reviewid;
private static String url;
private String TAG = SearchScreen.class.getSimpleName();
private ProgressDialog pDialog;
private String userid;
SessionManagement session;
@Override
protected void onCreate(Bundle savedInstanceState) {
reviewername = new ArrayList<>();
reviewscore = new ArrayList<>();
reviewerpic = new ArrayList<>();
reviewdate = new ArrayList<>();
reviewtext = new ArrayList<>();
reviewid = new ArrayList<>();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_reviews);
setTitle("My Reviews");
session = new SessionManagement(getApplicationContext());
HashMap<String, String> user = session.getUserDetails();
userid = user.get(SessionManagement.KEY_ID);
url = "url" + userid;
Log.d("URL", url);
initViews();
}
private void initViews() {
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.myreviewslist);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
new GetMyReviews().execute();
}
private class GetMyReviews extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Showing progress dialog
pDialog = new ProgressDialog(MyReviews.this);
pDialog.setMessage("Please Wait..");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
HttpHandler sh = new HttpHandler();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall(url);
Log.e(TAG, "Response from url: " + jsonStr);
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
JSONArray contacts = jsonObj.getJSONArray("MyGeek");
// looping through All Contacts
for (int i = 0; i < contacts.length(); i++) {
JSONObject c = contacts.getJSONObject(i);
reviewername.add(c.getString("reviewername"));
reviewscore.add(c.getString("reviewscore"));
reviewerpic.add(c.getString("reviewerpic"));
reviewdate.add(c.getString("reviewdate"));
reviewtext.add(c.getString("reviewtext"));
reviewid.add(c.getString("reviewid"));
}
} catch (final JSONException e) {
Log.e(TAG, "Json parsing error: " + e.getMessage());
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),
"Json parsing error: " + e.getMessage(),
Toast.LENGTH_LONG)
.show();
}
});
}
} else {
Log.e(TAG, "Couldn't get json from server.");
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),
"Couldn't get json from server. Check LogCat for possible errors!",
Toast.LENGTH_LONG)
.show();
}
});
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
pDialog.hide();
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.myreviewslist);
RecyclerView.Adapter adapter = new DataAdapterMyReviews(reviewername, reviewscore, reviewerpic, reviewdate, reviewtext, reviewid);
recyclerView.setAdapter(adapter);
}
}
}
DataAdapterMyReviews.Java
public class DataAdapterMyReviews extends RecyclerView.Adapter<DataAdapterMyReviews.ViewHolder> {
private ArrayList<String> reviewername;
private ArrayList<String> reviewscore;
private ArrayList<String> reviewerpic;
private ArrayList<String> reviewdate;
private ArrayList<String> reviewtext;
private ArrayList<String> reviewid;
private static String url;
private String TAG = SearchScreen.class.getSimpleName();
private String success = "0";
public DataAdapterMyReviews(ArrayList<String> reviewername, ArrayList<String> reviewscore, ArrayList<String> reviewerpic, ArrayList<String> reviewdate, ArrayList<String> reviewtext, ArrayList<String> reviewid) {
this.reviewername = reviewername;
this.reviewscore = reviewscore;
this.reviewerpic = reviewerpic;
this.reviewscore = reviewscore;
this.reviewdate = reviewdate;
this.reviewtext = reviewtext;
this.reviewid = reviewid;
}
public void test(){
this.notifyDataSetChanged();
}
@Override
public DataAdapterMyReviews.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_row_reviews_withdelete, viewGroup, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(DataAdapterMyReviews.ViewHolder viewHolder, int i) {
final int num;
viewHolder.reviewnametext2.setText(reviewername.get(i));
viewHolder.reviewscoretext2.setText(reviewscore.get(i));
viewHolder.reviewtext2.setText(reviewtext.get(i));
viewHolder.reviewdate2.setText(reviewdate.get(i));
Picasso.with(viewHolder.itemView.getContext())
.load(reviewerpic.get(i))
.into(viewHolder.userpicreview2);
num = i;
viewHolder.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("Delete ReviewID: ", reviewid.get(num));
url = "url" + reviewid.get(num);
new DeleteReview().execute();
}
});
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
}
@Override
public int getItemCount() {
return reviewername.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private ImageView userpicreview2;
private TextView reviewnametext2;
private TextView reviewscoretext2;
private TextView reviewtext2;
private TextView reviewdate2;
private Button delete;
public ViewHolder(View view) {
super(view);
userpicreview2 = (ImageView) view.findViewById(R.id.userpicreview);
reviewnametext2 = (TextView) view.findViewById(R.id.reviewnametext);
reviewscoretext2 = (TextView) view.findViewById(R.id.reviewscoretext);
reviewtext2 = (TextView) view.findViewById(R.id.reviewtext2);
reviewdate2 = (TextView) view.findViewById(R.id.reviewdatetext);
delete = (Button) view.findViewById(R.id.btnDeleteReview);
}
}
private class DeleteReview extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Showing progress dialog
}
@Override
protected Void doInBackground(Void... arg0) {
HttpHandler sh = new HttpHandler();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall(url);
Log.e(TAG, "Response from url: " + jsonStr);
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
JSONArray contacts = jsonObj.getJSONArray("MyGeek");
// looping through All Contacts
JSONObject c = contacts.getJSONObject(0);
success = c.getString("success");
} catch (final JSONException e) {
Log.e(TAG, "Json parsing error: " + e.getMessage());
}
} else {
Log.e(TAG, "Couldn't get json from server.");
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if(success.equals("1")){
Log.d("reviewdelete","success");
test();
}
else if(success.equals("0")){
Log.d("reviewdelete","fail");
}
}
}
}
最佳答案
您需要通知您的activity
有关数据集更改的信息。关键点是调用适配器对象
的notifyDataSetChanged()
。您应该修改当前的 Activity 类以获取适配器的引用。最好将适配器代码放在 Activity 类的函数中,然后从内部类调用。
创建一个界面,
public interface DataListener {
void deleteSuccess();
void deleteError();
}
分配要通知的监听器,
public class MyReviews extends AppCompatActivity implements DataListener {
...your codes
//you need to implement the interface methods
@Override
public void deleteSuccess(){
adapter.notifyDataSetChanged();
Toast.makeText(this, "Successfully deleted",Toast.LENGTH_LONG).show();
}
@Override
public void deleteError(){
Toast.makeText(this, "Failed to delete",Toast.LENGTH_LONG).show();
}
}
通知监听器,
private class DeleteReview extends AsyncTask<Void, Void, Void> {
....your code...
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if(success.equals("1")){
//get the databaseListener object from your Adapter class constructor.
databaseListener.deleteSuccess();
}
else if(success.equals("0")){
databaseListener.deleteError();
}
}
关于java - Android 刷新 RecyclerView 内部自定义适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43468888/
我在另一个 RecyclerView(parentRecyclerView) 中实现了 RecyclerView(childRecyclerView),图片说明了所有的实现: 我想编写一个 espre
我正在构建一个应用程序,它使用ViewPager2在页面之间水平滚动,每个页面都有一个垂直滚动的内容RecyclerView,其中每个列表的第一个位置都有一行水平滚动小部件,例如附加到寻呼机指示器类型
我正在尝试实现一个水平的 recyclerview 并且 recyclerview 的每个项目都将是一个具有网格布局的垂直 recyclerview。我面临的问题是,当我尝试垂直滚动子 recycle
我使用显示条目列表的 RecyclerView。每个条目都托管另一个 RecyclerView,它是一个图像列表。 我现在想让这个嵌套的 RecyclerView 可点击,而不是它的项目,而是整个 V
我正在尝试将手机中的图像加载到我的回收 View 中。 到目前为止,我已经创建了一个 recyclerview.adapter 和一个 gridlayoutmanager,并将它们附加到我的 recy
我需要一个可扩展 View ,其中父/可扩展标题将具有文本和下拉箭头。每个此类标题的子项应该是在网格结构中具有多个项目的 View 。 (有点像带有 GridLayoutManager 的回收器 Vi
我正在使用显示不同类别列表的 RecyclerView。每行项目还包含 RecyclerView 以显示类别项目列表。父级 RecyclerView 由垂直 LinearLayoutManager 填
我正在更新一个旧的 Android 项目,现在我从 RecyclerView 中反复收到这条日志语句: W/RecyclerView:RecyclerView 不支持滚动到绝对位置。改为使用 scro
在我的 Adapter 中,我调用 LayoutManager.ChildAt(position) 来获取 itemview,但是我得到的 View 不是匹配的 itemview,当我调用 notif
我正在从 ListView 迁移到 RecyclerView,但是在 SQLite 中输入一些数据后,我的列表没有使用 notifyDataSetChanged() 更新;所以我总是要调用setAda
我正在用 Google Now Cards 的风格创建一组 5 张卡片。我首先关注的是总体布局。 我正在使用 CardView 和 RecyclerView ,我想要实现的是这样的: 这是我的 Car
在我的应用程序中,我有一个 RecyclerView,其中包含一个简单的项目 View ,每行包含一个 TextView 和一个 Spinner。 用户从操作栏中单击“保存”后,我需要遍历所有项目并获
我正在尝试检查 RecyclerView 中是否可以看到某些特定项目;但我无法实现。请帮助我确定我的项目是否在 RecyclerView 中完全可见。 mrecylerView.addOnScroll
我有一个提要片段,它的主要元素是帖子的 RecyclerView。 我正在使用 Lisa Wray 的 Groupie 库管理回收站 https://github.com/lisawray/group
我有这两个类似的行为回收器 View 适配器,它们之间的唯一区别是 onclick 方法和传递给它们的对象。所以,我正在考虑将类 B 设计为从回收器 View 适配器继承,这样我就可以更改构造函数来执
这很奇怪。我对这个问题感到沮丧。我将数据保存在 ArrayList 中。当我将数据放在 RecyclerView 上时。数据未显示在列表中。这是我的代码 listOrder.forEach { ord
编辑我通过使用 CoordinatorLayout 和 AppBarLayout 作为 header 和 TabLayout 的包装解决了这个问题。本来应该很明显,但是哦,好吧。 原始问题:我有一个设
我有一个回收 View 。我想从其适配器类更新回收器 View 。我尝试了 notiftDataSetChanged( ) 但它只适用于主类。下面是 recyclerview 适配器类的代码。 pac
我正在使用具有不同 viewholders 的 recyclerview(具有垂直 LinearLayout),其中一个有另一个 RecyclerView(带有水平 LL)。在第二个 recycler
我想创建一个与 Google Play Store 或 Netflix App 类似的布局,其中在单个 RecyclerView 中基本上有多个水平 RecyclerView。如果这不是他们做事的方式
我是一名优秀的程序员,十分优秀!