我使用的整个概念是当我在列表视图的单个列表项中单击文本视图时,我调用了从我的适配器类中的活动中定义的方法,然后在该方法中,我已经命中了api,当我得到响应,我再次加载列表,我得到了这个错误。
我的适配器类..
public class NewsFeedAdapter extends BaseAdapter {
Context context;
ArrayList<NewsFeed> newsFeedArrayList;
String residentId;
ViewHolder viewHolder;
//NewsFeedActivity newsFeedActivity;
public NewsFeedAdapter(Context context, ArrayList<NewsFeed> newsFeedArrayList,String residentId) {
this.context = context;
this.newsFeedArrayList = newsFeedArrayList;
this.residentId = residentId;
}
private class ViewHolder{
ImageView friendProfilePic,feedImage,deletePostBtn,likeBtn,commentBtn;
TextView friendName,postTime,feedPostTxt,totalLikes,totalComments;
RelativeLayout likeBtnLayout,commentBtnLayout,feedPostImageLayout;
}
@Override
public int getCount() {
return newsFeedArrayList.size();
}
@Override
public Object getItem(int i) {
return newsFeedArrayList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (view == null){
viewHolder = new ViewHolder();
view = layoutInflater.inflate(R.layout.news_feed_list_item,viewGroup,false);
viewHolder.friendProfilePic = view.findViewById(R.id.friend_profile_pic);
viewHolder.friendName = view.findViewById(R.id.friend_name);
viewHolder.postTime = view.findViewById(R.id.feed_post_date);
viewHolder.feedImage = view.findViewById(R.id.feed_post_image);
viewHolder.feedPostTxt = view.findViewById(R.id.feed_post_text);
viewHolder.deletePostBtn = view.findViewById(R.id.delete_post_btn);
viewHolder.likeBtn = view.findViewById(R.id.like_btn);
viewHolder.commentBtn = view.findViewById(R.id.comment_btn);
viewHolder.totalLikes = view.findViewById(R.id.no_of_likes);
viewHolder.totalComments = view.findViewById(R.id.no_of_comments);
viewHolder.likeBtnLayout = view.findViewById(R.id.like_btn_layout);
viewHolder.commentBtnLayout = view.findViewById(R.id.comment_btn_layout);
viewHolder.feedPostImageLayout = view.findViewById(R.id.feed_post_image_layout);
view.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) view.getTag();
}
//Log.w(AppConfig.TAG,"position is "+i);
final NewsFeed newsFeed = newsFeedArrayList.get(i);
viewHolder.feedImage.setBottom(0);
Glide.with(context).load(newsFeed.getFriendprofilePic())
.asBitmap().centerCrop().into(new BitmapImageViewTarget(viewHolder.friendProfilePic) {
@Override
protected void setResource(Bitmap resource) {
RoundedBitmapDrawable circularBitmapDrawable =
RoundedBitmapDrawableFactory.create(context.getResources(), resource);
circularBitmapDrawable.setCircular(true);
viewHolder.friendProfilePic.setImageDrawable(circularBitmapDrawable);
}
});
viewHolder.friendName.setText(newsFeed.getFriendName());
viewHolder.postTime.setText(newsFeed.getPostTime());
//Log.w(AppConfig.TAG,"pos is "+i+newsFeed.getFeedImage()+"");
if (!newsFeed.getFeedImage().equals("null")){
viewHolder.feedPostImageLayout.setVisibility(View.VISIBLE);
Glide.with(context).load(newsFeed.getFeedImage())
.thumbnail(0.5f)
.crossFade()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(viewHolder.feedImage);
}
else {
viewHolder.feedPostImageLayout.setVisibility(View.GONE);
}
viewHolder.feedPostTxt.setText(newsFeed.getFeedPostTxt());
if (newsFeed.getFriendId().equals(residentId)){
viewHolder.deletePostBtn.setVisibility(View.VISIBLE);
}
else {
viewHolder.deletePostBtn.setVisibility(View.GONE);
}
if (Integer.parseInt(newsFeed.getTotalLikes())>0){
viewHolder.totalLikes.setVisibility(View.VISIBLE);
viewHolder.totalLikes.setText(newsFeed.getTotalLikes()+" Likes");
}
else {
viewHolder.totalLikes.setVisibility(View.GONE);
}
if (Integer.parseInt(newsFeed.getTotalComments())>0){
viewHolder.totalComments.setVisibility(View.VISIBLE);
viewHolder.totalComments.setText(newsFeed.getTotalComments()+" Comments");
}
else {
viewHolder.totalComments.setVisibility(View.GONE);
}
viewHolder.totalLikes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, LikesResidentNamesActivity.class);
intent.putExtra(AppConfig.POST_ID,newsFeed.getPostId());
context.startActivity(intent);
}
});
viewHolder.totalComments.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, AllCommentsActivity.class);
intent.putExtra(AppConfig.POST_ID,newsFeed.getPostId());
context.startActivity(intent);
}
});
viewHolder.likeBtnLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
NewsFeedActivity newsFeedActivity = (NewsFeedActivity) context;
newsFeedActivity.likeDislikePost(newsFeed.getPostId());
}
});
viewHolder.commentBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
addComment(newsFeed);
}
});
viewHolder.commentBtnLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
addComment(newsFeed);
}
});
viewHolder.deletePostBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
deletePost(newsFeed.getPostId());
}
});
return view;
}
private void deletePost(final String postId){
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Delete Confirm?");
builder.setMessage("Are you sure want to delete this post?");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
NewsFeedActivity newsFeedActivity = (NewsFeedActivity) context;
newsFeedActivity.deletePost(postId);
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
private void addComment(NewsFeed newsFeed){
Intent intent = new Intent(context, AllCommentsActivity.class);
intent.putExtra(AppConfig.POST_ID,newsFeed.getPostId());
context.startActivity(intent);
}
}
这是我的活动代码..
public class NewsFeedActivity extends AppCompatActivity {
TextView toolbarTitle;
ImageView backBtn;
ListView newsFeedListView;
ArrayList<NewsFeed> newsFeedArrayList = new ArrayList<>();
NewsFeedAdapter newsFeedAdapter;
HashMap<String,String> residentDetails;
ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_news_feed);
toolbarTitle = (TextView) findViewById(R.id.toolbar_title);
backBtn = (ImageView) findViewById(R.id.back_btn);
progressBar = (ProgressBar) findViewById(R.id.progress_bar);
toolbarTitle.setText("News Feed");
backBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AppConfig.goBackToParentActivity(NewsFeedActivity.this);
}
});
DatabaseManager databaseManager = new DatabaseManager(NewsFeedActivity.this);
residentDetails = databaseManager.getResidentDetails();
newsFeedListView = (ListView) findViewById(R.id.news_feed_list_view);
View newsFeedListViewHeader = getLayoutInflater().inflate(R.layout.news_feed_list_header,null);
newsFeedListView.addHeaderView(newsFeedListViewHeader);
newsFeedAdapter = new NewsFeedAdapter(this,newsFeedArrayList,residentDetails.get(AppConfig.RESIDENT_ID));
newsFeedListView.setAdapter(newsFeedAdapter);
loadNewsFeed();
}
private void loadNewsFeed(){
newsFeedArrayList.clear();
StringRequest stringRequest = new StringRequest(Request.Method.POST,AppConfig.NEWS_FEED_METHOD, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
progressBar.setVisibility(View.GONE);
Log.w(AppConfig.TAG,response);
try {
JSONObject jsonObject = new JSONObject(response);
if (jsonObject.getInt(AppConfig.STATUS_CODE) == 201){
JSONArray newsFeedArray = jsonObject.getJSONArray(AppConfig.RESPONSE);
if (newsFeedArray.length()>0) {
for (int i = 0; i < newsFeedArray.length(); i++) {
JSONObject newsFeedObject = newsFeedArray.getJSONObject(i);
newsFeedArrayList.add(new NewsFeed(newsFeedObject.getString(AppConfig.POST_ID), newsFeedObject.getString(AppConfig.RESIDENT_ID), newsFeedObject.getString(AppConfig.RESIDENT_NAME), newsFeedObject.getString(AppConfig.RESIDENT_IMAGE),
AppConfig.strToDate(newsFeedObject.getString(AppConfig.POST_DATE)), newsFeedObject.getString(AppConfig.POST_IMG), newsFeedObject.getString(AppConfig.POST_STATUS),
newsFeedObject.getString(AppConfig.TOTAL_LIKES), newsFeedObject.getString(AppConfig.TOTAL_COMMENTS)));
}
newsFeedAdapter.notifyDataSetChanged();
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
progressBar.setVisibility(View.GONE);
}
})
{
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put(AppConfig.RESIDENT_SOCIETY_ID,residentDetails.get(AppConfig.RESIDENT_SOCIETY_ID));
params.put(AppConfig.RESIDENT_ID,residentDetails.get(AppConfig.RESIDENT_ID));
Log.w(AppConfig.TAG,params+"");
return params;
}
};
AppController.getInstance().addToRequestQueue(stringRequest);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == AppConfig.INTENT_REQUEST_CODE){
newsFeedArrayList.clear();
loadNewsFeed();
}
}
public void deletePost(String postId){
StringRequest stringRequest = new StringRequest(Request.Method.PUT, AppConfig.DELETE_POST_METHOD+postId, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.w(AppConfig.TAG,response);
try {
JSONObject jsonObject = new JSONObject(response);
if (jsonObject.getInt(AppConfig.STATUS_CODE)==201){
Toast.makeText(NewsFeedActivity.this, "Your post has been deleted successfully!", Toast.LENGTH_SHORT).show();
newsFeedArrayList.clear();
loadNewsFeed();
}
else {
Toast.makeText(NewsFeedActivity.this, "Some error occured!", Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
AppController.getInstance().addToRequestQueue(stringRequest);
}
public void likeDislikePost(final String postId){
StringRequest stringRequest = new StringRequest(Request.Method.POST, AppConfig.LIKE_UNLIKE_POST_METHOD, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.w(AppConfig.TAG,response);
try {
JSONObject jsonObject = new JSONObject(response);
if (jsonObject.getInt(AppConfig.STATUS_CODE) == 201){
loadNewsFeed();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
})
{
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put(AppConfig.RESIDENT_SOCIETY_ID,residentDetails.get(AppConfig.RESIDENT_SOCIETY_ID));
params.put(AppConfig.RESIDENT_ID,residentDetails.get(AppConfig.RESIDENT_ID));
params.put(AppConfig.POST_ID,postId);
Log.w(AppConfig.TAG,params+"");
return params;
}
};
AppController.getInstance().addToRequestQueue(stringRequest);
}
}
logcat的
java.lang.IndexOutOfBoundsException:Index:0,Size:0 at java.util.ArrayList.get(ArrayList.java:411) 在android.widget.HeaderViewListAdapter.isEnabled(HeaderViewListAdapter.java:164) 在android.widget.ListView.dispatchDraw(ListView.java:3467) 在android.view.View.draw(View.java:17337) 在android.widget.AbsListView.draw(AbsListView.java:4704) 在android.view.View.updateDisplayListIfDirty(View.java:16264) 在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3874) 在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3854) 在android.view.View.updateDisplayListIfDirty(View.java:16218) 在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3874) 在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3854) 在android.view.View.updateDisplayListIfDirty(View.java:16218) 在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3874) 在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3854) 在android.view.View.updateDisplayListIfDirty(View.java:16218) 在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3874) 在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3854) 在android.view.View.updateDisplayListIfDirty(View.java:16218) 在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3874) 在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3854) 在android.view.View.updateDisplayListIfDirty(View.java:16218) 在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3874) 在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3854) 在android.view.View.updateDisplayListIfDirty(View.java:16218) 在android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:661) 在android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:667) 在android.view.ThreadedRenderer.draw(ThreadedRenderer.java:775) 在android.view.ViewRootImpl.draw(ViewRootImpl.java:3188) 在android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2981) 在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2569) 在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1462) 在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:6965) 在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:907) 在android.view.Choreographer.doCallbacks(Choreographer.java:709) 在android.view.Choreographer.doFrame(Choreographer.java:644) 在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:893) 在android.os.Handler.handleCallback(Handler.java:836) 在android.os.Handler.dispatchMessage(Handler.java:103) 在android.os.Looper.loop(Looper.java:203) 在android.app.ActivityThread.main(ActivityThread.java:6251) at java.lang.reflect.Method.invoke(Native Method) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1075) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)