2015-02-26 1 views
0

Моя проблема заключается в следующем:положение Maintan прокрутки, когда перед именем ListView

У меня есть список новостей, который обновляется каждые несколько минут следующим образом:

Всегда новые сообщения появляются перед старыми (список Prepend)

// Step 1 - Prepend array list 
arraylist.add(0, map); 

// Step 2 - Notify 
adapter.notifyDataSetChanged(); 

Когда вы вызываете позицию прокрутки «notifyDataSetChanged», сохраняются, но .. Я хочу остаться в текущей позиции ... немного ниже.

например (Facebook> список перед именем после X минут)

, когда пользователь работает в верхней части, чтобы увидеть новые результаты.

Код проверки:

public class testActivity extends Activity { 
    // Declare Variables 
    private JSONArray jr; 

    private ListView listview; 

    private testAdapter adapter; 
    private ArrayList<HashMap<String, String>> arraylist; 

    private EditText message; 
    private ImageButton post; 

    private static final String TAG = "test.activity"; 

    /* Create */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_test); 

     listview = (ListView) findViewById(R.id.listview); 

     arraylist = new ArrayList<HashMap<String, String>>(); 
     adapter = new testAdapter(this, arraylist); 

     listview.setAdapter(adapter); 

     message = (EditText) findViewById(R.id.message); 
     post = (ImageButton) findViewById(R.id.post); 

     post.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       postMessage(); 
      } 
     }); 

    } 

    /* Post Message */ 

    public void postMessage() { 
     new MyRequest(this, "user", "post", 
       MyRequest.setParam 
         (
           "message", message.getText().toString().trim() 
         ) 
     ) { 
      @Override 
      public void Done(String resp, JSONObject data) { 
       HashMap<String, String> map = new HashMap<String, String>(); 

       try { 

        map.put("date", data.getString("date")); 
        map.put("message", data.getString("message")); 

        arraylist.add(0, map); 

        Parcelable state = listview.onSaveInstanceState(); 

        listview.setAdapter(adapter); 
        listview.onRestoreInstanceState(state); 
       } 
       catch (JSONException e) { 
        Log.e(TAG, "Error JSON Fetch!"); 
       } 
      } 
     }; 
    } 
} 

TestAdapter:

public class testAdapter extends BaseAdapter { 
    Context context; 
    LayoutInflater inflater; 
    ArrayList<HashMap<String, String>> data; 
    HashMap<String, String> resultp = new HashMap<String, String>(); 

    public testAdapter(Context context, 
         ArrayList<HashMap<String, String>> arraylist) { 
     this.context = context; 
     data = arraylist; 
    } 

    @Override 
    public int getCount() { 
     return data.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return data.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) { 
     View itemView = convertView; //trying to reuse a recycled view 

     ViewHolder holder = null; 

     if (itemView == null) //The view is not a recycled one .. we have to inflate 
     { 
      inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      itemView = inflater.inflate(R.layout.listview_item, parent, false); 

      holder = new ViewHolder(); 

      holder.date = (TextView) itemView.findViewById(R.id.message); 
      holder.message = (TextView) itemView.findViewById(R.id.date); 

      itemView.setTag(holder); 
     } 
     else // View recycled 
      holder = (ViewHolder) itemView.getTag(); 

     resultp = data.get(position); 

     holder.message.setText(resultp.get("message")); 
     holder.date.setText(resultp.get("date")); 

     return itemView; 
    } 

    /* View Holder */ 
    static class ViewHolder { 
     TextView message; 
     TextView date; 
    } 
} // End Class 
+0

Какой подкласс «адаптера» вы используете? –

+0

Пользовательский адаптер BaseAdapter –

+0

myCustomAdapter расширяет BaseAdapter –

ответ

0

Для того, чтобы сохранить позицию скроллер был перед обновлением данных, вы должны сначала получить позицию первого элемента в адаптере по:

int position = listView.getFirstVisiblePosition();

, а затем:

listView.setSelection(position);

установить скроллер быть на указанной позиции при входе в ListView деятельности.

Редактировать: После быстрого поиска я наткнулся на вопрос this. Вы можете найти несколько способов реализовать то, что вы хотите, и разные мнения, но вышеуказанный путь является самым простым из того, что я вижу.

Edit 02: Так как вы говорите, что ваш ListView обновляется сверху вниз вы можете сделать следующее:

Parcelable state = listView.onSaveInstanceState(); 
listView.setAdapter(adapter); 
listView.onRestoreInstanceState(state); 

Первая строка Получает элемента ListView точный state. Вторая линия устанавливает адаптер. Третья строка повторно применяет (ранее сохраненную) state.

+0

Да ... Я пробовал это ... но мой список обновлен в верхней части (режим добавления). Это означает, что текущая позиция не соответствует. –

+0

Я пробовал только сейчас и получил тот же результат. –

+0

Не могли бы вы вывести какой-то код (список и адаптер), чтобы мы могли понять это? –

Смежные вопросы