在列表视图上应用自定义适配器

时间:2015-12-06 16:18:39

标签: java android listview android-fragments custom-adapter

我制作了一个自定义适配器并用数据填充它。我已经使用Logcat来查看我传递给自定义Adapter类的数组是否包含数据。 我得到的错误如下。创建此CategoryBlog时会发生此问题。已创建活动但不包含列表视图

 exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference

'mainblogpost'包含我想要填充的所有数据的数组。 'MainListActivityAdapter'是适配器类。 'Category_Blogs'是我想要设置列表视图的类。

Category_Blog.java

我不添加import语句。它没有错误

public class Category_Blogs extends AppCompatActivity implements AbsListView.OnItemClickListener {

public static final String TAG = MainActivity.class.getSimpleName();
public final static String EXTRA_MESSAGE = "com.example.talha.appforblog.MESSAGE";
List<StackOverflowXmlParser.Entry> mainBlogPost = new ArrayList<StackOverflowXmlParser.Entry>();
private ListAdapter mAdapter;
private AbsListView mListView;
private ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_category__blogs);
    //Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
    //setSupportActionBar(toolbar);
    Intent intent = getIntent();
    String message = intent.getStringExtra(Tab2.EXTRA_MESSAGE);
    String link = message.trim() + "?feed=titles";
    Log.d("ye category click krne par next activity me ye link bnta hy parsing ke liye",link);
    loadPage(link);
}


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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}


public void loadPage(String link) {
    Log.d(TAG, "loadpage me a gae nh");
    // if((sPref.equals(ANY)) && (wifiConnected || mobileConnected)) {
    new DownloadXmlTask(this).execute(link);

}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

}

private class DownloadXmlTask extends AsyncTask<String, Void, List<StackOverflowXmlParser.Entry>> {
    private Context mContext;

    public DownloadXmlTask(Context context) {
        mContext = context;
    }

    @Override
    protected List<StackOverflowXmlParser.Entry> doInBackground(String... urls) {
        try {
            return loadXmlFromNetwork(urls[0]);

        } catch (Exception e) {
            Log.d("test", "" + e);
        }
        return null;
    }

    @Override
    protected void onPostExecute(List<StackOverflowXmlParser.Entry> results) {
        if (results != null) {
            try {
                String title, link, image, pubDate;
                Log.d("test", "onpost");
                // custom array adapter
                ArrayList<HashMap<String, String>> blogPosts = new ArrayList<HashMap<String, String>>();
                for (StackOverflowXmlParser.Entry result : results) {
                    title = result.title;
                    link = result.link;
                    image = result.image;
                    pubDate = result.pubDate;
                    HashMap<String, String> blogPost = new HashMap<String, String>();
                    blogPost.put("link", link);
                    blogPost.put("title", title);
                    blogPost.put("image", image);
                    blogPost.put("pubDate", pubDate);
                    blogPosts.add(blogPost);
                }
                // copying to main item List array
                for (int i = 0; i < results.size(); i++) {
                    mainBlogPost.add(results.get(i));
                }
                Log.d("fff", results.get(1).pubDate);
                MainListActivityAdapter mAdapter =
                        new MainListActivityAdapter(Category_Blogs.this, mainBlogPost);
                listView.setAdapter(mAdapter);
                //((AdapterView<ListAdapter>) mListView).setAdapter(mAdapter);

                // Set OnItemClickListener so we can be notified on item clicks
                mListView.setOnItemClickListener(Category_Blogs.this);
            }
            catch (Exception e){
                Log.d("test", "exception: "+e);
            }
        }
    }

    private List<StackOverflowXmlParser.Entry> loadXmlFromNetwork(String urlString) throws XmlPullParserException, IOException {
        InputStream stream = null;
        // Instantiate the parser
        StackOverflowXmlParser stackOverflowXmlParser = new StackOverflowXmlParser();
        List<StackOverflowXmlParser.Entry> entries = null;
        String title = null;
        String url = null;

        try {
            //opening the connection and fetching
            stream = downloadUrl(urlString);
            entries = stackOverflowXmlParser.parse(stream);
            // Makes sure that the InputStream is closed after the app is
            // finished using it.
        } catch (Exception e) {
            Log.d("test", "" + e);
        } finally {
            if (stream != null) {
                stream.close();
            }
        }
        for (StackOverflowXmlParser.Entry entry : entries) {
            Log.d("aaa",entry.pubDate);
        }

        return entries;
    }
  private InputStream downloadUrl(String urlString) throws IOException {
        java.net.URL url = new java.net.URL(urlString);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000);
        conn.setConnectTimeout(15000);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        // Starts the query
        conn.connect();

        return conn.getInputStream();
    }

}

}

MainListActivityAdapter.java

public class MainListActivityAdapter extends BaseAdapter {

private Activity activity;
List<StackOverflowXmlParser.Entry> mainBlogPost = new ArrayList<StackOverflowXmlParser.Entry>();
private static LayoutInflater inflater = null;

public MainListActivityAdapter(Activity a, List<StackOverflowXmlParser.Entry> main) {
    activity = a;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mainBlogPost = main;
}

public int getCount() {
    return mainBlogPost.size();
}

public Object getItem(int position) {
    return position;
}

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

public View getView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;

    Log.d("test", "fetching" + position);
    String tit = mainBlogPost.get(position).title;
    String cate = mainBlogPost.get(position).pubDate;
    String pub = mainBlogPost.get(position).pubDate;
    String image_url = "http://download.androidhive.info/img/btn_fb_login.png";
    if (convertView == null)
        vi = inflater.inflate(R.layout.list_row, null);

    TextView title = (TextView) vi.findViewById(R.id.title); // title
    TextView cat = (TextView) vi.findViewById(R.id.category); // category
    ImageView image = (ImageView) vi.findViewById(R.id.list_image); // image
    TextView publish = (TextView) vi.findViewById(R.id.pubDate); // publish date

    // Setting all values in listview
    title.setText(tit);
    cat.setText(cate);
    publish.setText(pub);
    Glide.with(activity)
            .load(image_url)
            .into(image);
    return vi;
}

}

Activity_category_blog.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent"
android:layout_height="wrap_content" tools:context="com.example.talha.test_fragement.Category_Blogs"
xmlns:ads="http://schemas.android.com/apk/res-auto">
<include layout="@layout/tool_bar" />
<FrameLayout  android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@layout/tool_bar">
    <ListView android:id="@android:id/list" android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/adView" android:divider="#b5b5b5"
        android:dividerHeight="1dp"
        android:layout_alignParentBottom="true"
        />


    <TextView android:id="@android:id/empty" android:layout_width="match_parent"
        android:layout_height="match_parent" android:gravity="center"
        android:layout_gravity="right|top" />

</FrameLayout>

2 个答案:

答案 0 :(得分:0)

 You fail to initialize the listview.

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_category__blogs);
        //Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
**listView = (ListView) findViewById(R.id.list);**
        //setSupportActionBar(toolbar);
        Intent intent = getIntent();
        String message = intent.getStringExtra(Tab2.EXTRA_MESSAGE);
        String link = message.trim() + "?feed=titles";
        Log.d("ye category click krne par next activity me ye link bnta hy parsing ke liye",link);
        loadPage(link);
    }

答案 1 :(得分:0)

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_category__blogs);
listView = (ListView) findViewById(R.id.lvID);//where lvID is id from your listview placed in activity_category__blogs layout.