自定义listview fling异常

时间:2013-08-14 19:15:08

标签: android android-listview

我开始学习android并遇到问题。在我的Gesture监听器中,在“OnFling”方法中,我得到了一个带有e1参数的NullPointerException,但是e2 arg正常指向。请帮忙。

我的活动代码如下:

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:

package 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;
        }

}

1 个答案:

答案 0 :(得分:0)

在尝试在ListViews中包含onFling侦听器之前,我曾经遇到过这种情况。似乎如果你的ListView仍然检测到一些触摸事件(例如,触摸或正常滚动),它将消耗motionEvents。因此,您必须为MotionEvents准备有时为空。