单击recyclerview中的特定项目时,在SQLite中获取ID

时间:2016-03-16 19:10:41

标签: android android-sqlite android-recyclerview android-tablayout

如果在我的recyclerview上点击了特定数据,我如何从我的sqlite数据库中获取id?为简单起见,我有一个名为“tblmynotes”的数据库,它存储以下列名:

术语,定义,语法和代码。

我有这个仅显示“条款”的回收视图,但是当您点击recyclerview中的某个项目时,它会从列条款以及存储在其定义,语法和列中的列中的数据中检索它的ID。码。之后,它在另一个活动中显示定义,语法和代码,该活动是一个tablayout,有3个选项卡,即每个列要显示。

我有一些尝试,但无法看到解决方案,因为每次我点击我的recyclerview中的项目时,它都会重新开始回到主要活动。

这是我的代码:

My_Notes_View_TabFragment.java

 package com.zaid.recyclerviewsqlite.viewNotes;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;

import com.zaid.recyclerviewsqlite.R;

public class My_Notes_View_TabFragment extends Fragment {

    private int position;
    public TextView content;



    public static Fragment getInstance(int position) {
        My_Notes_View_TabFragment f = new My_Notes_View_TabFragment();
        Bundle args = new Bundle();
        args.putInt("position", position);
        f.setArguments(args);
        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //get data from Argument
        position = getArguments().getInt("position");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.my_notes_view_tab_fragment, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);


        content = (EditText) view.findViewById(R.id.textView);

        //setContentView(); 



    }






}

My_Notes_View_Main.java

注意onTabSelectedListener中注释的if / else语句,我不确定它是否正确。

package com.zaid.recyclerviewsqlite.viewNotes;

import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

import com.zaid.recyclerviewsqlite.R;

public class My_Notes_View_Main extends AppCompatActivity implements View.OnClickListener {

    private final int numOfPages = 3; //viewpager has 4 pages
    private final String[] pageTitle = {"Definition", "Syntax", "Code"};
    private ImageButton addNew;
    private TextView content;
    My_Notes_View_TabFragment tabs = new My_Notes_View_TabFragment();




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

        content = (TextView)findViewById(R.id.textView);        

        addNew = (ImageButton)findViewById(R.id.addNew);
        addNewTerms();

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar1);
        setSupportActionBar(toolbar);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);

        for (int i = 0; i < numOfPages; i++) {
            tabLayout.addTab(tabLayout.newTab().setText(pageTitle[i]));
        }

        //set gravity for tab bar
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

        final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
        final PagerAdapter adapter = new My_Notes_View_MyPagerAdapter(getSupportFragmentManager(), numOfPages);

        viewPager.setAdapter(adapter);
        viewPager.setOffscreenPageLimit(4);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.setOnTabSelectedListener(onTabSelectedListener(viewPager));

    }

    private TabLayout.OnTabSelectedListener onTabSelectedListener(final ViewPager pager) {
        return new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                pager.setCurrentItem(tab.getPosition());
               /** 
                if(tab.getPosition() == 0){
                    content.setText(getIntent().getStringExtra("note_def"));
                } else if (tab.getPosition() == 1) {

                    content.setText(getIntent().getStringExtra("note_syntax"));
                } else if (tab.getPosition() == 2) {

                    content.setText(getIntent().getStringExtra("note_code"));
                }
               */   

            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        };
    }

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

    public void addNewTerms(){
        addNew.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub



                Toast.makeText(getApplicationContext(), "Add Button Clicked!", Toast.LENGTH_SHORT).show();
            }

    });
    }

  /**  private void setContentView() {
        int position;
        if (tabs.getInstance(position) == 0) {

            content.setText(getIntent().getStringExtra("note_def"));
        } else if (position == 1) {

            content.setText(getIntent().getStringExtra("note_syntax"));
        } else if (position == 2) {

            content.setText(getIntent().getStringExtra("note_code"));
        }
    }
*/
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

    }






}

My_Notes_View_MyPagerAdapter.java

package com.zaid.recyclerviewsqlite.viewNotes;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.util.SparseArray;

public class My_Notes_View_MyPagerAdapter extends FragmentStatePagerAdapter {
    int numOfTabs;
//private final SparseArray<Fragment> mPageReferences = new SparseArray<Fragment>();



    public My_Notes_View_MyPagerAdapter(FragmentManager fm, int numOfTabs) {
        super(fm);
        this.numOfTabs = numOfTabs;
    }

    @Override
    public Fragment getItem(int position) {

       return My_Notes_View_TabFragment.getInstance(position);
    }

    @Override
    public int getCount() {
        return numOfTabs;
    }


}

这是我的recyclerview中的自定义适配器 我不确定onClick方法是否正确。

CustomAdapter.java

package com.zaid.recyclerviewsqlite.notes;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.zaid.recyclerviewsqlite.R;
import com.zaid.recyclerviewsqlite.mynote_databases.DatabaseHelper;
import com.zaid.recyclerviewsqlite.viewNotes.My_Notes_View_Main;

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {

    private List<DataModel> items;
    Context context;
    static DatabaseHelper db;



    public CustomAdapter(List<DataModel> items, Context context){
        this.items = items;
        this.context = context;
    }



    public static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        TextView textViewTerm;
        List<DataModel> items = new ArrayList<DataModel>();
        Context context;

        public MyViewHolder(View itemView, Context context, List<DataModel> items) {
            super(itemView);
            this.items = items;
            this.context = context;
            itemView.setOnClickListener(this);


            this.textViewTerm = (TextView) itemView.findViewById(R.id.textViewTerm);

            //textViewTerm.setOnClickListener((OnClickListener) this);
        }

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            int position = getAdapterPosition();
            DataModel item = this.items.get(position);
            Intent i = new Intent(this.context,My_Notes_View_Main.class);
            i.putExtra("note_id",item.getId());
            i.putExtra("note_def",item.getDefinition());
            i.putExtra("note_syntax",item.getSyntax());
            i.putExtra("note_code", item.getCode());
            this.context.startActivity(i);

        }


    }


    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent,
                                           int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.my_notes_card_view, parent, false);

        view.setOnClickListener(My_Notes.myOnClickListener);

        MyViewHolder myViewHolder = new MyViewHolder(view,context,items);
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int listPosition) {

        holder.textViewTerm.setText(items.get(listPosition).getTerm());
    }

    @Override
    public int getItemCount() {
        return items.size();
    }


}

最后一个附加信息我的datamodel,因为它定义了数据结构,以便将我的数据从sqlite数据库显示到recyclerview中。

DataModel.java

public class DataModel {

    String term_;
    String definition_;
    int id_;
    String syntax_;
    String code_;

    public DataModel(){

    }

    public DataModel(int id, String term, String def, String syntax, String code) {
        this.term_ = term;
        this.id_ = id;
        this.definition_=def;
        this.syntax_=syntax;
        this.code_=code;
    }

    public DataModel(String term, String def, String syntax, String code) {
        this.term_ = term;
        this.definition_=def;
        this.syntax_=syntax;
        this.code_=code;
    }

   // insert getter and setter method here

}

正如我已经提到的那样,每当我点击特定项目时,我的应用程序就会重新启动,从而返回主要活动。我不知道这个错误,因为我不明白logcat信息显示的是什么,因为它是简短的并且没有足够的信息,除了我在方法ViewHolder中的CustomAdapter.java上有nullpointerexception

logcat的

03-17 03:05:20.177: D/AndroidRuntime(21473): Shutting down VM
03-17 03:05:20.177: W/dalvikvm(21473): threadid=1: thread exiting with uncaught exception (group=0x55e06b20)
03-17 03:05:20.177: D/AndroidRuntime(21473): procName from cmdline: com.zaid.recyclerviewsqlite
03-17 03:05:20.177: E/AndroidRuntime(21473): in writeCrashedAppName, pkgName :com.zaid.recyclerviewsqlite
03-17 03:05:20.177: D/AndroidRuntime(21473): file written successfully with content: com.zaid.recyclerviewsqlite StringBuffer : ;com.zaid.recyclerviewsqlite
03-17 03:05:20.177: E/AndroidRuntime(21473): FATAL EXCEPTION: main
03-17 03:05:20.177: E/AndroidRuntime(21473): Process: com.zaid.recyclerviewsqlite, PID: 21473
03-17 03:05:20.177: E/AndroidRuntime(21473): java.lang.NullPointerException
03-17 03:05:20.177: E/AndroidRuntime(21473):    at android.content.ComponentName.<init>(ComponentName.java:77)
03-17 03:05:20.177: E/AndroidRuntime(21473):    at android.content.Intent.<init>(Intent.java:3813)
03-17 03:05:20.177: E/AndroidRuntime(21473):    at com.zaid.recyclerviewsqlite.notes.CustomAdapter$MyViewHolder.onClick(CustomAdapter.java:57)
03-17 03:05:20.177: E/AndroidRuntime(21473):    at android.view.View.performClick(View.java:4443)
03-17 03:05:20.177: E/AndroidRuntime(21473):    at android.view.View$PerformClick.run(View.java:18442)
03-17 03:05:20.177: E/AndroidRuntime(21473):    at android.os.Handler.handleCallback(Handler.java:733)
03-17 03:05:20.177: E/AndroidRuntime(21473):    at android.os.Handler.dispatchMessage(Handler.java:95)
03-17 03:05:20.177: E/AndroidRuntime(21473):    at android.os.Looper.loop(Looper.java:136)
03-17 03:05:20.177: E/AndroidRuntime(21473):    at android.app.ActivityThread.main(ActivityThread.java:5021)
03-17 03:05:20.177: E/AndroidRuntime(21473):    at java.lang.reflect.Method.invokeNative(Native Method)
03-17 03:05:20.177: E/AndroidRuntime(21473):    at java.lang.reflect.Method.invoke(Method.java:515)
03-17 03:05:20.177: E/AndroidRuntime(21473):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827)
03-17 03:05:20.177: E/AndroidRuntime(21473):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643)
03-17 03:05:20.177: E/AndroidRuntime(21473):    at dalvik.system.NativeStart.main(Native Method)

发生崩溃的地方: 在CustomAdapter.java中

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

    int position = getAdapterPosition();
    DataModel item = this.items.get(position);
    Intent i = new Intent(this.context,My_Notes_View_Main.class);
    i.putExtra("note_id",item.getId());
    i.putExtra("note_def",item.getDefinition());
    i.putExtra("note_syntax",item.getSyntax());
    i.putExtra("note_code", item.getCode());
    this.context.startActivity(i);

}

My_Notes.java 这是我的recyclerview,其中正在查看条款,它的适配器位于CustomAdapter.java

package com.zaid.recyclerviewsqlite.notes;

import java.util.ArrayList;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;


import com.zaid.recyclerviewsqlite.R;
import com.zaid.recyclerviewsqlite.addNotes.My_Notes_Add_Notes;
import com.zaid.recyclerviewsqlite.mynote_databases.DatabaseHelper;

public class My_Notes extends AppCompatActivity implements View.OnClickListener {

    private static RecyclerView.Adapter adapter;
    private RecyclerView.LayoutManager layoutManager;
    private static RecyclerView recyclerView;
    private static ArrayList<DataModel> data;
    static View.OnClickListener myOnClickListener;
    private static ArrayList<Integer> removedItems;
    private ImageButton addNote;
    DatabaseHelper db;

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

        //database
             db = new DatabaseHelper(this);


       //   myOnClickListener = new MyOnClickListener(this);

        addNote = (ImageButton)findViewById(R.id.addNotes);
        recyclerView = (RecyclerView) findViewById(R.id.my_notes_recyclerview);
        recyclerView.setHasFixedSize(true);

        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(new CustomAdapter(db.getAllDataModel(),null));







        btnAdd();
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }



    public void btnAdd(){
        addNote.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent i = new Intent(getApplicationContext(),My_Notes_Add_Notes.class);
                startActivity(i);
            }
        });
    }

   /** public static class MyOnClickListener implements View.OnClickListener{
         DatabaseHelper db = new DatabaseHelper(this);
         private final Context context;



         private MyOnClickListener(Context context) {
             this.context = context;
         }

         @Override
         public void onClick(View v) {
             removeItem(v);
         }

         private void removeItem(View v) {
             int selectedItemPosition = recyclerView.getChildPosition(v);
             RecyclerView.ViewHolder viewHolder
                     = recyclerView.findViewHolderForPosition(selectedItemPosition);
             TextView textViewName
                     = (TextView) viewHolder.itemView.findViewById(R.id.textViewTerm);
             String selectedName = (String) textViewName.getText();

             int selectedItemId = -1;
             for (int i = 0; i < db.getAllDataModel.length; i++) {
                 if (selectedName.equals(DataModel.nameArray[i])) {
                     selectedItemId = DataModel.id_[i];
                 }
             }
             removedItems.add(selectedItemId);
             data.remove(selectedItemPosition);
             adapter.notifyItemRemoved(selectedItemPosition);
         }

    }

*/
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

    }
}

0 个答案:

没有答案