如果在我的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
}
}