2016-02-23 2 views
1

Я пытаюсь реализовать метод «Прокрутить, чтобы загрузить больше» в моем приложении, но я получил эту ошибку, когда я впервые ударил ее. Это то, что он показал в консоли:SwipeRefreshLayout получил ошибку и не может обновить (загрузить больше) в первый раз

E/SwipeRefreshLayout: Got ACTION_MOVE событие, но не имеет активный указателя идентификатора. E/SwipeRefreshLayout: Получено событие ACTION_MOVE, но нет активного идентификатора указателя. E/SwipeRefreshLayout: Получено событие ACTION_MOVE, но не имеют активного идентификатора указателя. E/SwipeRefreshLayout: событие ACTION_MOVE , но не имеет активного идентификатора указателя.

Это мой код макета:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context="training.com.chatgcmapplication.ChatActivity"> 


    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <android.support.design.widget.AppBarLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:theme="@style/AppTheme.AppBarOverlay"> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       android:background="?attr/colorPrimary" 
       app:popupTheme="@style/AppTheme.PopupOverlay" /> 

     </android.support.design.widget.AppBarLayout> 

     <android.support.v4.widget.SwipeRefreshLayout 
      android:id="@+id/swipeLayout" 
      android:layout_width="match_parent" 
      android:layout_height="380dp"> 

      <ListView 
       android:id="@+id/listMessage" 
       android:layout_width="match_parent" 
       android:layout_height="380dp" 
       android:layout_alignParentLeft="false" 
       android:layout_alignParentTop="false" 
       android:divider="@null" 
       android:listSelector="@android:color/transparent" 
       android:stackFromBottom="true" 
       android:transcriptMode="alwaysScroll" /> 

     </android.support.v4.widget.SwipeRefreshLayout> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="horizontal" 
      android:weightSum="1"> 

      <EditText 
       android:id="@+id/txt_chat" 
       android:layout_width="0dp" 
       android:layout_height="match_parent" 
       android:layout_weight="0.92" 
       android:inputType="text" /> 

      <Button 
       android:id="@+id/btn_send" 
       android:layout_width="wrap_content" 
       android:layout_height="match_parent" 
       android:layout_marginLeft="30dp" 
       android:text="@string/btn_send" /> 
     </LinearLayout> 
    </LinearLayout> 


</android.support.design.widget.CoordinatorLayout> 

И когда я красть во второй раз: он загрузит двойные данные.

Это ChatActivity, чем реализовать этот метод: ПРИЧИНУ

public class ChatActivity extends AppCompatActivity implements View.OnClickListener, SwipeRefreshLayout.OnRefreshListener { 
    private static EditText txt_chat; 
    private String registId; 
    private String chatTitle; 
    private MessageSender mgsSender; 
    private int userId; 
    private DatabaseHelper databaseHelper; 
    private TimeUtil timeUtil; 
    private MessageAdapter messageAdapter; 
    private int offsetNumber = 5; 
    private SwipeRefreshLayout swipeRefreshLayout; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_chat); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     if (getSupportActionBar() != null) { 
      getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     } 
     Button btn_send = (Button) findViewById(R.id.btn_send); 
     txt_chat = (EditText) findViewById(R.id.txt_chat); 
     swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeLayout); 
     swipeRefreshLayout.setOnRefreshListener(this); 
     ListView lv_message = (ListView) findViewById(R.id.listMessage); 
     timeUtil = new TimeUtil(); 
     databaseHelper = DatabaseHelper.getInstance(getApplicationContext()); 
     btn_send.setOnClickListener(this); 
     Bundle bundle = getIntent().getExtras(); 
     chatTitle = bundle.getString("titleName"); 
     if (getIntent().getBundleExtra("INFO") != null) { 
      chatTitle = getIntent().getBundleExtra("INFO").getString("name"); 
      this.setTitle(chatTitle); 
     } else { 
      this.setTitle(chatTitle); 
     } 
     registId = bundle.getString("regId"); 
     userId = databaseHelper.getUser(chatTitle).getUserId(); 
     List<Message> messages = databaseHelper.getLastTenMessages(AppConfig.USER_ID, databaseHelper.getUser(chatTitle).getUserId(), 0); 
     messageAdapter = new MessageAdapter(getApplicationContext(), R.layout.chat_item, (ArrayList<Message>) messages); 
     LocalBroadcastManager.getInstance(this).registerReceiver(onNotice, new IntentFilter("Msg")); 
     if (messages.size() > 0) lv_message.setAdapter(messageAdapter); 
    } 

    private BroadcastReceiver onNotice = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String message = intent.getStringExtra("message"); 
      try { 
       Message messageObj = new Message(); 
       messageObj.setMessage(message); 
       messageObj.setUserId(userId); 
       messageObj.setSender_id(AppConfig.USER_ID); 
       messageObj.setExpiresTime(timeUtil.formatDateTime(timeUtil.getCurrentTime())); 
       messageAdapter.add(messageObj); 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 
      messageAdapter.notifyDataSetChanged(); 
     } 
    }; 


    @Override 
    public void onBackPressed() { 
     super.onBackPressed(); 
     finish(); 
    } 


    @Override 
    protected void onDestroy() { 
     LocalBroadcastManager.getInstance(this).unregisterReceiver(onNotice); 
     super.onDestroy(); 
    } 


    private static MessageSenderContent createMegContent(String regId, String title) { 
     String message = txt_chat.getText().toString(); 
     MessageSenderContent mgsContent = new MessageSenderContent(); 
     mgsContent.addRegId(regId); 
     mgsContent.createData(title, message); 
     return mgsContent; 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.btn_send: 
       String message = txt_chat.getText().toString(); 
       databaseHelper = DatabaseHelper.getInstance(getApplicationContext()); 
       mgsSender = new MessageSender(); 
       new AsyncTask<Void, Void, Void>() { 
        @Override 
        protected Void doInBackground(Void... params) { 
         MessageSenderContent mgsContent = createMegContent(registId, AppConfig.USER_NAME); 
         mgsSender.sendPost(mgsContent); 
         return null; 
        } 
       }.execute(); 
       databaseHelper.addMessage(message, timeUtil.getCurrentTime(), userId, AppConfig.USER_ID); 
       txt_chat.setText(""); 
       try { 
        Message messageObj = new Message(); 
        messageObj.setMessage(message); 
        messageObj.setUserId(AppConfig.USER_ID); 
        messageObj.setSender_id(userId); 
        messageObj.setExpiresTime(timeUtil.formatDateTime(timeUtil.getCurrentTime())); 
        messageAdapter.add(messageObj); 
       } catch (ParseException e) { 
        e.printStackTrace(); 
       } 
       messageAdapter.notifyDataSetChanged(); 
       break; 
     } 
    } 


    @Override 
    public void onRefresh() { 
     swipeRefreshLayout.setRefreshing(true); 
     List<Message> messages = databaseHelper.getLastTenMessages(AppConfig.USER_ID, databaseHelper.getUser(chatTitle).getUserId(), offsetNumber); 
     messageAdapter.insertToTheFirst(messages); 
     messageAdapter.notifyDataSetChanged(); 
     offsetNumber += 5; 
     Log.i("Offset number", offsetNumber + ""); 
     swipeRefreshLayout.setRefreshing(false); 
    } 

} 

UPDATE НОМЕРА

я нашел причину этого вопроса. Это из-за меня заставить ListView прокрутки в нижней части, когда она инициализации с этим кодом:

android:stackFromBottom="true" 

я заменить этот код с этим, но до сих пор тот же вопрос:

lv_message.post(new Runnable() { 
      @Override 
      public void run() { 
       lv_message.setSelection(lv_message.getCount() -1); 
      } 
     }); 
+0

Вы можете добавить вашу деятельность, которая реализует это, а также полный LogCat, а также пожалуйста. – ChonBonStudios

+0

Я только что добавил активность, которая реализует метод, и logcat: он показывает эту ошибку много раз. –

+0

Любое решение по этой проблеме? :( –

ответ

1

Я думаю, что проблема есть, Вы пытаетесь показать, убрать и обновить swipeRefreshLayout внутри того же метода, то есть onRefresh(). сделать раздельные методы для показа и отклоняя диалог и вызывать их из того места, где они необходимы, как я сделал ниже:

@Override 
    public void onRefresh() { 
     // refresh code here. 
    } 

    @Override 
    public void showDialog() { 
     swipeRef.post(new Runnable() { 
      @Override 
      public void run() { 
       if(swipeRef != null) 
        swipeRef.setRefreshing(true); 
      } 
     }); 
    } 

    @Override 
    public void dismissDialog() { 
     if(swipeRef!=null && swipeRef.isShown()) 
      swipeRef.setRefreshing(false); 
    } 
+0

Я действительно реализовал * интерфейс OnRefreshListener * уже, но не могу переопределить showDialog() и rejectDialog(). Вы уверены, что он принадлежит этому интерфейсу? –

+0

Я отредактировал ответ, предположим, что вы правы. –

+0

Мог ли я поместить два диалоговых метода в onRefresh() method –