Проблемы с использованием переменных из моего пользовательского адаптера

Я использую представление списка и создаю собственный адаптер. Я пытаюсь понравиться сообщение каждый раз, когда кнопка нажата. Объявленная кнопка связана с каждым элементом в представлении списка. Есть три проблемы, с которыми я сталкиваюсь:

1) Когда я нажимаю кнопку «Мне нравится», «случайная» кнопка вниз по списку также нажимается.

2) Когда я щелкаю лайк, он обновляет счетчик лайков, но когда я прокручиваю вниз из поля зрения, а затем прокручиваю назад вверх, счетчик лайков сбрасывается.

3) Когда я нажимаю кнопку «Мне нравится», количество лайков изменяется, и теперь, когда я нажимаю «Мне нравится» в другом сообщении, количество лайков меняется на то, какое количество лайков было в первой кнопке «Мне нравится», которую я нажал.

Я застрял на этом какое-то время, любая помощь очень ценится.

Вот код для класса адаптера:

    class PostsAdapter extends ArrayAdapter<Posts> implements View.OnClickListener {
//used to create views from xml
private LayoutInflater layoutInflater;

public PostsAdapter(Context context, int textViewResourceId, List<Posts> posts) {
super(context, textViewResourceId, posts);
layoutInflater = LayoutInflater.from(context);
}
//add to xml from dataset
@Override
// view convertview = recycled view
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
Holder holder = null;
Posts posts = getItem(position);

//checks if recycled view is null, thewn creates new view, if not null, use same view
if(view == null){
view = layoutInflater.inflate(R.layout.activity_posts, null);

Button like = (Button) view.findViewById(R.id.btnLike);
TextView content = (TextView) view.findViewById(R.id.content);
TextView user = (TextView) view.findViewById(R.id.user);
TextView topic = (TextView) view.findViewById(R.id.topic);
TextView date = (TextView) view.findViewById(R.id.date);
TextView likes = (TextView) view.findViewById(R.id.likeCount);
TextView hiddenId = (TextView) view.findViewById(R.id.hiddenID);

holder = new Holder(content, user, topic, date, likes, hiddenId, like);

view.setTag(holder);
like.setTag(holder);
}
else{
holder = (Holder) view.getTag();
}
holder.content.setText(posts.getContent());
holder.user.setText(posts.getUser());
holder.topic.setText(posts.getTopic());
holder.date.setText(posts.getDate());
holder.likes.setText(posts.getLikes());
holder.hiddenId.setText(posts.getId());

holder.like.setOnClickListener(this);

return view;
}

@Override
public void onClick(View v) {
Button like = (Button) v;
Holder holder = (Holder) v.getTag();
Toast.makeText(DisplayPosts.this, "Button: " + like.getText(), Toast.LENGTH_LONG).show();

createLike(holder.like, holder.hiddenId, holder.likes);
}
}

static class Holder{
public TextView content;
public TextView user;
public TextView topic;
public TextView date;
public TextView likes;
public TextView hiddenId;
public Button like;

public Holder(TextView content, TextView user, TextView topic, TextView date, TextView likes, TextView hiddenId, Button like) {
this.content = content;
this.user = user;
this.topic = topic;
this.date = date;
this.likes = likes;
this.hiddenId = hiddenId;
this.like = like;
}
}

Вот метод createLike:

    private void createLike(final Button like, final TextView hiddenid, final TextView likes){
final String hid = hiddenid.getText().toString().trim();

if(like.getText().toString().equalsIgnoreCase("like")){
like.setText("UnLike");
StringRequest stringRequest = new StringRequest(Request.Method.POST, Config.SERVER_ADDRESS + "LikePost.php",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {

JSONObject jsonObject = null;
try {
//json string to jsonobject
jsonObject = new JSONObject(response);
//get json sstring created in php and store to JSON Array
result2 = jsonObject.getJSONArray(Config.json_array_likes);
//get username from json array
likes.setText(getLikeCount(result2));
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {

// corresponding values.
Map<String,String> hashMap = new HashMap<>();
//maps specified string key, to specified string value
hashMap.put(Config.hid, hid);
return hashMap;
}
};

//add string request to queue
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
else{
like.setText("Like");
}
}
private String getLikeCount(JSONArray jsonArray){
String lc = null;
for(int i = 0; i < jsonArray.length(); i++) {
try {
JSONObject json = jsonArray.getJSONObject(i);
likeCount.add(json.getString(Config.getLike));
lc = likeCount.get(0);
} catch (JSONException e) {
}
}
return lc;
}

1

Решение

Я думаю, корень проблемы в том, что вы используете статический модификатор в своем классе держателя, отбросьте это, и я думаю, что это решит вашу проблему.

0

Другие решения

Вместо

holder.like.setOnClickListener(this);

Попробуй это —

holder.like.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
createLike(position,holder.like, holder.hiddenId, holder.likes);//Added one more parameter "position"}
);

Сейчас в createLike() Вы должны обновить свой набор данных «posts«с новым как на счет на элемент в»position«-

                        @Override
public void onResponse(String response) {

JSONObject jsonObject = null;
try {
//json string to jsonobject
jsonObject = new JSONObject(response);
//get json sstring created in php and store to JSON Array
result2 = jsonObject.getJSONArray(Config.json_array_likes);
//get username from json array
likes.setText(getLikeCount(result2));

//Update like count here
posts.get(position).setLikeCount(); //The count which you want to update

} catch (JSONException e) {
e.printStackTrace();
}
}
0

Обновить:

    public class PostsAdapter extends ArrayAdapter<Posts>  {
//used to create views from xml
Context context;
int textViewResourceId;
ArrayList<Posts> mPosts = new ArrayList<Posts>();

public PostsAdapter(Context context, int textViewResourceId, ArrayList<Posts> posts) {
super(context, textViewResourceId, posts);
this.textViewResourceId = textViewResourceId;
this.context = context;
this.mPosts = posts;
}

// view convertview = recycled view
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
final Holder holder;
//checks if recycled view is null, thewn creates new view, if not null, use same view
if(view == null){
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
view = inflater.inflate(textViewResourceId, parent, false);

Button like = (Button) view.findViewById(R.id.btnLike);
TextView content = (TextView) view.findViewById(R.id.content);
TextView user = (TextView) view.findViewById(R.id.user);
TextView topic = (TextView) view.findViewById(R.id.topic);
TextView date = (TextView) view.findViewById(R.id.date);
TextView likes = (TextView) view.findViewById(R.id.likeCount);
TextView hiddenId = (TextView) view.findViewById(R.id.hiddenID);
holder = new Holder(content, user, topic, date, likes, hiddenId, like);

view.setTag(holder);
}
else{
holder = (Holder) view.getTag();
}

Posts posts = mPosts.get(position);
holder.content.setText(posts.getContent());
holder.user.setText(posts.getUser());
holder.topic.setText(posts.getTopic());
holder.date.setText(posts.getDate());
holder.likes.setText(posts.getLikes());
holder.hiddenId.setText(posts.getId());

holder.like.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
createLike(position, holder.like, holder.hiddenId, holder.likes);//Added one more parameter "position"}
});

return view;
}

private void createLike(final int position, final Button like, final TextView hiddenid, final TextView likes){
final String hid = hiddenid.getText().toString().trim();

if(like.getText().toString().equalsIgnoreCase("like")){
like.setText("UnLike");
StringRequest stringRequest = new StringRequest(Request.Method.POST, Config.SERVER_ADDRESS + "LikePost.php",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {

JSONObject jsonObject = null;
try {
//counter
n+=1;

//json string to jsonobject
jsonObject = new JSONObject(response);
//get json sstring created in php and store to JSON Array
result2 = jsonObject.getJSONArray(Config.json_array_likes);
//get username from json array
String likestring = getLikeCount(result2);
String likenum = mPosts.get(position).getLikes(likestring);
likes.setText(likenum);

} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {

// corresponding values.
Map<String,String> hashMap = new HashMap<>();
//maps specified string key, to specified string value
hashMap.put(Config.hid, hid);
return hashMap;
}
};

//add string request to queue
RequestQueue requestQueue = Volley.newRequestQueue(DisplayPosts.this);
requestQueue.add(stringRequest);
}
else{
like.setText("Like");
}
}
private String getLikeCount(JSONArray jsonArray){
System.out.println("JSON: " + jsonArray);
String lc = null;
for(int i = 0; i < jsonArray.length(); i++) {
try {
JSONObject json = jsonArray.getJSONObject(i);
likeCount.add(json.getString(Config.getLike));
System.out.println("i: " + i);
lc = likeCount.get(n - 1);
} catch (JSONException e) {
}
}
System.out.println("LC: " + lc);
return lc;
}
class Holder{
public TextView content;
public TextView user;
public TextView topic;
public TextView date;
public TextView likes;
public TextView hiddenId;
public Button like;

public Holder(TextView content, TextView user, TextView topic, TextView date, TextView likes, TextView hiddenId, Button like) {
this.content = content;
this.user = user;
this.topic = topic;
this.date = date;
this.likes = likes;
this.hiddenId = hiddenId;
this.like = like;
}
}
}
0