2015-07-02 1 views
0

У меня есть пользовательский ListView, где я показываю элементы из jsonArray, которые я загружаю с сервера. Теперь я хочу, чтобы пользователь мог «как» записи. Поэтому, когда он нажимает на ListItem, база данных сервера обновляется, поэтому увеличивается количество Likes. Чтобы избежать того, что пользователям может нравиться бесконечное время, я сохраняю строку в базе данных SQLite с положением ListItem. Это прекрасно работает до тех пор, пока в базе данных сервера не появятся новые записи, и позиции меняются. Как я могу решить эту проблему? Есть ли возможность получить идентификатор от ListItem вместо позитива или чего-то еще? Вот мой код:Получить ListItem Id

getALlEntrysListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Cursor cursor = getLikes(dbh); 
       cursor.moveToFirst(); 
       if (cursor.moveToFirst()) { 
        do { 
        /*check if Item is liked (=1) or not (=0)*/ 
         if (Integer.parseInt(cursor.getString(2)) == 1) { 
          dbh.updateLike(dbh, position, Integer.parseInt(cursor.getString(2)), 0); 
          dislike(position); 
          cursor.close(); 
         } else if (Integer.parseInt(cursor.getString(2)) == 0) { 
          dbh.updateLike(dbh, position, Integer.parseInt(cursor.getString(2)), 1); 
          likeUpload(position); 
          cursor.close(); 
         } else { 
          dbh.addLike(dbh, position, 1); 
          likeUpload(position); 
          cursor.close(); 
         } 
        } while (cursor.moveToNext()); 
       } 

/*increase numer of likes on the Server Database (the dislike method works the same way):*/ 
public void likeUpload (int position){ 
    try { 

     JSONObject entryClicked = jsonArray.getJSONObject(position); 
     entryID = entryClicked.getString("id"); 

     final List<NameValuePair> params = new ArrayList<NameValuePair>(); 
     params.add(new BasicNameValuePair("id", entryID)); 

     new AsyncTask<ApiConnector, Long, Boolean>() { 
      @Override 
      protected Boolean doInBackground(ApiConnector... apiConnectors) { 
       return apiConnectors[0].like(params); 

      } 
     }.execute(new ApiConnector()); 

     finish(); 
     startActivity(getIntent()); 
+0

Вместо того, чтобы использовать положение, чтобы знать, если пользователь понравилось или не использовать идентификатор объекта «за» это ListView. – Leonardo

ответ

0

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

public class YourListAdapter extends ArrayAdapter<CustomPojo> { 

.... 
@Override 
     public long getItemId(int position) { 
      if(listOfData!=null) { 
       return Long.valueOf(listOfData.get(position).getId()); 
      } 
      return -1; 
     } 
..... 

} 
0

попробовать этот способ может помочь вам

@Override 
public void onItemClick(AdapterView<?> adapter, View view, int position, 
     long id) { 
    // TODO Auto-generated method stub 

    switch (adapter.getId()) { 
    case R.id.listView: 
      YourVOClass yourVOClass = (YourVOClass) listView 
        .getItemAtPosition(position); 
        } 
       } 
Смежные вопросы