2013-08-14 4 views
0

Я начинаю изучать Android и испытываю проблемы. На моем слушателе Gesture в методе «OnFling» у меня есть исключение NullPointerException с аргументом e1, но e2 arg указывают нормально. Пожалуйста помоги.custom listview fling exception

Моего кода активности Подписчики ниже:

public class MainActivity extends Activity { 

    public dbWorker d = null; 
    public ArrayList<Row> newsContainer = new ArrayList<Row>(); 
    private static ArrayList<Row> cached = new ArrayList<Row>(); 
    public static int cache_guid = 0; 
    public static Row selectedItem = null; 


    private ListView newsList = null; 
    ListArrayAdapter aa = null; 

    private static final int SWIPE_MIN_DISTANCE = 120; 
    private static final int SWIPE_MAX_OFF_PATH = 250; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 200; 
    private GestureDetector gestureDetector; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     d = new dbWorker(this); 
     cache_guid = d.getMaxGuid(); 
     newsList = (ListView) findViewById(R.id.listView1); 

     aa = new ListArrayAdapter(this, newsContainer); 
     newsList.setAdapter(aa); 
     newsList.setClickable(true); 
     newsList.setBackgroundColor(color.holo_blue_dark); 

     refreshRssList(); 
     setTitle("Rss Reader/ Main page"); 
     gestureDetector = new GestureDetector(this,new MyGestureDetector(), null, false); 

     // Set the touch listener for the main view to be our custom gesture listener 
     newsList.setOnTouchListener(new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       if (gestureDetector.onTouchEvent(event)) { 
        return true; 
       } 
       return false; 
      } 
     }); 

     newsList.setOnItemClickListener(new OnItemClickListener(){ 
      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 

      } 

     }); 
    } 

    class MyGestureDetector extends SimpleOnGestureListener { 
     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     Intent intent = new Intent(MainActivity.this.getBaseContext(), FavActivity.class); 

      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) { 
       return false; 
      } 

      /* right to left swipe 
      if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
      startActivity(intent); 
      MainActivity.this.overridePendingTransition(
      R.anim.slide_in_right, 
      R.anim.slide_out_left 
      ); 

      // right to left swipe 
      } else */ 
      if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
      startActivity(intent); 
      MainActivity.this.overridePendingTransition(
      R.anim.slide_in_left, 
      R.anim.slide_out_right 
      ); 
      } 

      return false; 
     } 

     // It is necessary to return true from onDown for the onFling event to register 
     @Override 
     public boolean onDown(MotionEvent e) { 
       return true; 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 



    private void refreshRssList() { 

     ArrayList<Row> newItems = rssWorker.getNews(this); 
     ArrayList<Row> for_save = new ArrayList<Row>(); 

     if (dbWorker.readAll() != null) 
      cached = dbWorker.readAll(); 

     if (newItems == null) 
     { 
      Toast.makeText(this, "Connection error!", 3).show(); 
      return; 
     } 


     for (int i = 0; i < newItems.size(); i++) 
     { 
      Row tmp = newItems.get(i); 
      cached.add(tmp); 
      for_save.add(tmp); 
     } 

     newsContainer.clear(); 

     if (cached != null) 
      newsContainer.addAll(cached); 

     d.SaveAll(for_save); 

     aa.notifyDataSetChanged(); 
     } 
} 

И ArrayAdapter:

пакета com.example.rssreader;

public final class ListArrayAdapter extends ArrayAdapter<Row> { 

    private final Context c; 
    private final List<Row> items; 

    public ListArrayAdapter(Context context, List<Row> objects) { 
     super(context, R.layout.list, objects); 
     c = context; 
     items = objects; 
    } 


     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 

      final Row selectedItem = items.get(position); 

      LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View rowView = inflater.inflate(R.layout.list, parent, false); 
      TextView newsTitle = (TextView) rowView.findViewById(R.id.titleView); 
      final ImageView favIcon = (ImageView) rowView.findViewById(R.id.imageView1); 
      LinearLayout newsLay = (LinearLayout) rowView.findViewById(R.id.listLayout); 

      Date d = new Date(); 
      d.setTime(selectedItem.pubdate); 
      SimpleDateFormat sdf = new SimpleDateFormat("MM/dd - hh:mm:ss"); 

      newsTitle.setText(selectedItem.name + " " + sdf.format(d)); 

      if (selectedItem.isRead == 0) 
       newsLay.setBackgroundColor(Color.BLUE); 
      else 
       newsLay.setBackgroundColor(Color.GRAY); 

      if (selectedItem.isFav == 1) 
      { 
       favIcon.setImageResource(R.drawable.ic_tab_name_selected); 
      } else { 
       favIcon.setImageResource(R.drawable.ic_tab_name_unselected); 
      } 
      favIcon.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View v) { 
       if (selectedItem.isFav == 1){ 
        favIcon.setImageResource(R.drawable.ic_tab_name_unselected); 
        selectedItem.isFav = 0; 
       } 
       else 
       { 
        favIcon.setImageResource(R.drawable.ic_tab_name_selected); 
        selectedItem.isFav = 1; 
       } 
       dbWorker.SaveState(selectedItem); 
      } 

      }); 
      newsTitle.setOnClickListener(new OnClickListener(){ 

       @Override 
       public void onClick(View v) { 
        MainActivity.selectedItem = selectedItem; 
        c.startActivity(new Intent(v.getContext(), ItemActivity.class)); 

        if (selectedItem.isRead != 1) 
        { 
         selectedItem.isRead = 1; 
         dbWorker.SaveState(selectedItem); 
        } 
       } 
      }); 
      return rowView; 
     } 

} 
+0

Пожалуйста, добавьте ошибку NullPointerException из журнала. – MCWhitaker

+0

Е/AndroidRuntime (790): неустранимое: Основной Е/AndroidRuntime (790): java.lang.NullPointerException Е/AndroidRuntime (790): \t в com.example.rssreader.MainActivity $ MyGestureDetector.onFling (MainActivity.java : 79) E/AndroidRuntime (790): \t на android.view.GestureDetector.onTouchEvent (GestureDetector.java:600) 08-14 19: 23: 02.260: E/AndroidRuntime (790): \t at com.example. rssreader.MainActivity $ 1.onTouch (MainActivity.java:57) E/AndroidRuntime (790): \t на android.view.View.dispatchTouchEvent (View.java:7241) E/AndroidRuntime (790): \t на android.view .ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:2168) –

ответ

0

У меня это случалось со мной, прежде чем пытаться включить onFling-слушателей в ListViews. Похоже, что если ваш ListView все еще обнаруживает некоторые события касания (например, сенсорный или обычный свиток), он будет потреблять motionEvents. Поэтому вы должны быть готовы к тому, чтобы MotionEvents иногда были пустыми.

+0

Эти события движения - ar e аргументов метода onFling. Как я могу это определить раньше? –

+0

Я не уверен, что понимаю ваш вопрос. Основная проблема заключается в том, что (IIRC), пока вы используете ListView, вы не сможете доверять настраиваемым параметрам метода onFling. Я не думаю, что это возможно. Конечно, я ошибаюсь. – bee