android 外部调用activity 2C

我从一个链接直接进入app里面的某个acitivity,我用scheme
**_

 <intent-filter>
                    <!--下面这几个必须要设置-->
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                    <!--协议部分-->
                <data android:scheme="myapp" android:host="baidu" android:path="/news" android:port="8080"/>
        </intent-filter>**_
            这样写,还是调不起来,有哪位大神,帮忙看下。

6个回答

我记得我的仅仅写了这个 链接以myapp开头就能调起了

缺了

缺了android.intent.category.DEFAULT

其实完全可以自己对连接进行规则定义,不用按照这种通俗的套路来做,点击跳转加载链接之前先对连接进行解析

谢谢各位大哥,小弟最后解决了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Activity中调用 自定义LinearLayout布局文件方法
``` public class LoginActivity extends BaseActivity { private LoginView mLoginView; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { this.mLoginView = new LoginView(this); this.mLoginView.setDataShowPage(this.mType); } } public class LoginView extends LinearLayout { private TextView tv_bind_switch; public LoginView(Context context) { super(context); this.activity = (Activity) context; initView(); } public LoginView(Context context, @Nullable AttributeSet attributeSet) { super(context, attributeSet); this.activity = (Activity) context; initView(); } public LoginView(Context context, @Nullable AttributeSet attributeSet, int i) { super(context, attributeSet, i); this.activity = (Activity) context; initView(); } public void initView(){ LayoutInflater.from(this.activity).inflate(R.layout.view_login_layout,this); this.tv_bind_switch = findViewById(R.id.tv_bind_switch) } public void setDataShowPage{ this.tv_bind_switch.setVisibility(View.GONE); } } ``` //已经初始化的LinearLayout,外部调用更改内部布局,不生效怎么办
从Github上下载的android蓝牙代码,显示外部无法调用非公共
https://github.com/pkarira/Androble 这个是代码链接 我用的是他提供的参考MainActivity 具体代码是 ``` package com.example.snowpig.myble; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.ListView; import android.widget.Toast; import com.mdg.androble.BluetoothActivity; import com.mdg.androble.BluetoothManager; import com.mdg.androble.DeviceList; import java.util.Observable; import java.util.Observer; public class MainActivity extends BluetoothActivity { BluetoothManager bluetoothManager; receiveMassage rm; DeviceList dl; String type=""; ListView listview; int c=0; EditText et1; EditText et2; private ArrayAdapter adapter; @Override protected void onCreate(Bundle saveInstanceState){ super.onCreate(saveInstanceState); setContentView(R.layout.activity_main); bluetoothManager=BluetoothManager.getInstance(); rm=new receiveMassage(); dl=new DeviceList(); listview=(ListView)findViewById(R.id.select_dialog_listview); et1=(EditText)findViewById(R.id.text); et2=(EditText)findViewById(R.id.text2); listview.setOnItemClickListener(new AdapterView.OnItemClickListener(){ @Override public void onItemClick(AdapterView<?>parent, View view,int position,long id){ String itemValue=(String) listview.getItemAtPosition(position); bluetoothManager.connectTo(itemValue); } }); adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1); listview.setAdapter(adapter); } public void client(View v) { type = "CLIENT"; bluetoothManager.Type(type); } public void server(View v){ type="SERVER"; bluetoothManager.Type(type); } public void start(View v){ bluetoothManager.setMessageObject(rm); bluetoothManager.setListObject(dl); if (type.equals("CLIENT")){ enableBluetooth(); } if (type.equals("SERVER")){ enableBluetooth(); } } public void clienttoclient(View v){ bluetoothManager.clientToClient(et1.getText().toString(),Integer.parseInt(et2.getText().toString())); } public void devicelist(View v){ if(type.equals("SERVER")) Toast.makeText(getApplicationContext(), bluetoothManager.getAllConnectedDevices(), Toast.LENGTH_LONG).show(); else bluetoothManager.getAllConnectedDevices(); } public void send(View v){ if(type.equals("CLIENT")){ bluetoothManager.sendText(et1.getText().toString()); } if (type.equals("SERVER")){ bluetoothManager.sendText(et1.getText().toString(),Integer.parseInt(et2.getText().toString())); } } public void disconnect(View v){ Toast.makeText(getApplicationContext(),bluetoothManager.disconnect(),Toast.LENGTH_LONG).show(); } class receiveMassage implements Observer{ @Override public void update(Observable observable,Object data){ final String msg=((receivemsg)observable).getMessage(); runOnUiThread(new Runnable(){ public void run(){ Toast.makeText(MainActivity.this,msg,Toast.LENGTH_LONG).show(); } }); } } class DeviceList implements Observer{ @Override public void update(Observable observable,Object data){ if(((com.mdg.androble.DeviceList)observable).getContent().equals("bluetooth enabled")){ bluetoothManager.scanClients(); } else adapter.add(((com.mdg.androble.DeviceList)observable).getContent()); } } } ``` 报错的内容是 1、类MainActivity 没有变量bm ——改为bluetoothManager出现新错误:unhandled exception:java.io.IOException 2、类MainActivity.receiveMassage 没有类receivemsg 3&5、getContent()在DeviceList中不是公共的 4、scanClients()在BluetoothManager中不是公共的
关于android子类重写父类方法,方法体里面的方法的问题
android中子类重写父类Activity方法,在onCreate这个方法的方法体里面有个setContentView方法,这个方法是调用外部方法吗,为什么前面没加this关键词,不是说方法的方法体里面调用外部方法要加this关键词,加了没加有什么区别
android中泛型传入一个外部类,处理后传回原来的类,问题求解!
部分代码如下: 入口类定义一泛型private List<Item_activity> itemlist; itemlist=new ArrayList<Item_activity>(); 创建外部类对象 GetData getdata=new GetData(itemlist); getdata.returndata(); 包中的外部类 public class GetData extends Activity{ private List<Item_activity> itemlist; public GetData(List<Item_activity> itemlist) { super(); this.itemlist = itemlist; } // // // public List<Item_activity> returndata(){ itemlist.add(new Item_activity(R.drawable.ic_launcher, "我是标题", "我是内容")); return itemlist; } 对itemlist赋值处理,返回原类。 问题:itemlist.add(new Item_activity(R.drawable.ic_launcher, "我是标题", "我是内容")),为什么处理语句加载 外部类中的OnCreate().中就无法执行了那,后来我发现在GetData getdata=new GetData(itemlist);时, 没调 用外部类中的OnCreate()。为啥?不是在实例化一个外部类时,必须调用一次OnCreate()吗? 本人初学者忘指导。谢谢了!
调用外部API不成功,显示的什么执行时间长,我实在解决不了了
下面是我的util package textview.exam; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; /** * Created by fei on 2016/6/16. */ public class Shishinews { String httpUrl = "http://apis.baidu.com/songshuxiansheng/news/news"; String httpArg = ""; String jsonResult = request(httpUrl, httpArg); //System.out.println(jsonResult); /** * @param urlAll * :请求接口 * @param httpArg * :参数 * @return 返回结果 */ public static String request(String httpUrl, String httpArg) { BufferedReader reader = null; String result = null; StringBuffer sbf = new StringBuffer(); httpUrl = httpUrl + "?" + httpArg; try { URL url = new URL(httpUrl); HttpURLConnection connection = (HttpURLConnection) url .openConnection(); connection.setRequestMethod("GET"); // 填入apikey到HTTP header connection.setRequestProperty("apikey", "f761aa7e1d7b5ebe4******"); connection.connect(); InputStream is = connection.getInputStream(); reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); String strRead = null; while ((strRead = reader.readLine()) != null) { sbf.append(strRead); sbf.append("\r\n"); } reader.close(); result = sbf.toString(); } catch (Exception e) { e.printStackTrace(); } return result; } } 下面是我fragment的代码 package textview.exam; import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class FragmentMainchatnews extends Fragment { String httpUrl = "http://apis.baidu.com/songshuxiansheng/news/news"; String httpArg = ""; private String[] title;//新闻标题 private String[] abs;//新闻简介 private String[] image_url;//图片链接地址 Thread thread = null; String newsjson; @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { // TODO Auto-generated method stub View view=inflater.inflate(R.layout.main_chat_news, null); return view; } // 开启线程得到答案 Runnable runnable = new Runnable() { @Override public void run() { newsjson = Shishinews.request(httpUrl, httpArg); Log.v("debug",newsjson); Message message = new Message(); message.what = 1;// 标志是哪个线程传数据 } }; @SuppressLint("HandlerLeak") class MyHandler extends Handler { // 接受message的信息 @Override public void handleMessage(Message msg) { super.handleMessage(msg); try { JSONObject object = new JSONObject(newsjson); newsjson = object.get("retDate").toString(); } catch (JSONException e) { e.printStackTrace(); } if (msg.what == 1) { // 创建一个List集合,List集合的元素是Map List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>(); for (int i = 0; i < title.length; i++) { Map<String, Object> listItem = new HashMap<String, Object>(); listItem.put("image", image_url[i]); listItem.put("title", title[i]); listItem.put("abs", abs[i]); listItems.add(listItem); } // 创建一个SimpleAdapter SimpleAdapter simpleAdapter = new SimpleAdapter(getActivity(), listItems,R.layout.simple_item, new String[]{"image", "title", "abs"}, new int[]{R.id.image, R.id.title ,R.id.abs}); ListView list = (ListView) getView().findViewById(R.id.chat_news); // 为ListView设置Adapter list.setAdapter(simpleAdapter); // 为ListView的列表项的单击事件绑定事件监听器 list.setOnItemClickListener(new AdapterView.OnItemClickListener() { // 第position项被单击时激发该方法 @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent=new Intent(getActivity(),ChatActivity.class); startActivity(intent); } }); // 为ListView的列表项的选中事件绑定事件监听器 list.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { // 第position项被选中时激发该方法 @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { System.out.println(title[position] + "被选中了"); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } } } public void sendMessage() { if (getView().findViewById(R.id.chat_news)==null) { Toast.makeText(getActivity(), "下拉刷新", Toast.LENGTH_SHORT).show(); } else { // 创建一个List集合,List集合的元素是Map List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>(); for (int i = 0; i < title.length; i++) { Map<String, Object> listItem = new HashMap<String, Object>(); listItem.put("image", image_url[i]); listItem.put("title", title[i]); listItem.put("abs", abs[i]); listItems.add(listItem); } thread = new Thread(runnable); thread.start(); } } } 下面是我AndroidMainfest.xml中的代码 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="textview.exam" > <!-- 添加权限 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.READ_PROFILE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".LoginActivity" android:label="@string/title_activity_login" android:windowSoftInputMode="adjustResize|stateHidden" > </activity> <activity android:name=".ChatActivity" android:label="@string/title_activity_chat" > android:labl="聊天" </activity> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> </application> </manifest> 该有的权限我应该都设置了,可是还是不成功,大神们啊,这个我是解决不了了,就想获取个简单的新闻,我连什么关键词都没有
android,这代码运行怎么崩了?
DataBaseHelpe.java ``` package com.example.definecontentprovider; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class DataBaseHelpe extends SQLiteOpenHelper{ public static final String DB_NAME="userdb.db"; public static final String TABLENAME="userinfo"; public static final int DB_VERSION=1; public static final String CREATETABLE="create table"+TABLENAME+"(_id integer primary key,username text,userpassword text);"; public DataBaseHelpe(Context context) { super(context,DB_NAME,null,DB_VERSION); } public void onCreate(SQLiteDatabase db) { db.execSQL(CREATETABLE); } public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) { Log.i("Database update......","Update database from"+oldVersion+"to"+newVersion); db.execSQL("drop table if it exists"+TABLENAME); onCreate(db); } } ``` MainActivity.java ``` package com.example.definecontentprovider; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ContentResolver cr=getContentResolver(); //增加记录 ContentValues values=new ContentValues(); values.put("username","admin"); values.put("userpassword","123456"); cr.insert(UserProvider.CONTENT_URI, values); values.clear(); values.put("username","zhangsan"); values.put("userpassword","666666"); cr.insert(UserProvider.CONTENT_URI, values); //查询所有记录 Cursor cursor=cr.query(UserProvider.CONTENT_URI, null, null, null, null); Log.i("after inserted","-------------------------"); while(cursor.moveToNext()){ Log.i("after inserted","id:"+cursor.getString(0)+"username:"+cursor.getString(1)+"userpassword:"+cursor.getString(2)); } cursor.close(); //修改记录 values.clear(); values.put("username","lisi"); //构建的Uri为:"content://com.chapt6.userprovider/userinfo/2" Uri uri=ContentUris.withAppendedId(UserProvider.CONTENT_URI,2); //修改id为2的记录 cr.update(uri, values, null, null); //查询id为2的记录 cursor=cr.query(uri, null, null, null, null); Log.i("after updated","-------------------------"); while(cursor.moveToNext()){ Log.i("after updated","id:"+cursor.getString(0)+"username:"+cursor.getString(1)+"userpassword:"+cursor.getString(2)); } cursor.close(); //删除id为2的记录 cr.delete(uri, null, null); //查询记录 cursor=cr.query(UserProvider.CONTENT_URI, null, null, null, null); Log.i("after deleted","-------------------------"); while(cursor.moveToNext()){ Log.i("after deleted","id:"+cursor.getString(0)+"username:"+cursor.getString(1)+"userpassword:"+cursor.getString(2)); } cursor.close(); } @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; } @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(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } ``` UserProvider.java ``` package com.example.definecontentprovider; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.util.Log; public class UserProvider extends ContentProvider{ private DataBaseHelpe dbh=null; //发布Content Provider的Uri地址 private static final String AUTHORITY="com.chapt6.userprovider"; public static final Uri CONTENT_URI=Uri.parse("content://com.chapt6.userprovider/userinfo"); //注册需要匹配的Uri private static UriMatcher uriMatcher=new UriMatcher(UriMatcher.NO_MATCH); static { Log.i("info", "static"); //建立URI和URI_CODE之间的关联 uriMatcher.addURI(AUTHORITY, "userinfo",1); uriMatcher.addURI(AUTHORITY, "userinfo/#",2); } //该方法在ContentProvider创建后就会被调用,在其他应用第一次访问它时才会被创建 public boolean onCreate(){ Log.i("info", "onCreate"); dbh=new DataBaseHelpe(getContext()); return false; } //该方法用于返回当前Uri所代表数据的MIME类型 public String getType(Uri uri){ Log.i("info", "getType"); switch (uriMatcher.match(uri)){ case 1://操作的数据类型为集合类型,返回值以vnd.android.cursor.dir/开头 //得到person表的所有数据 return "vnd.android.cursor.dir/userinfo"; case 2://操作的数据类型为非集合类型,返回值以vnd.android.cursor.item/开头 //得到person表下面,每一条数据 return "vnd.android.cursor.item/userinfo"; } return null; } //该方法用于供外部应用从ContentProvider删除数据 public int delete(Uri uri,String selection,String[] selectionArgs){ SQLiteDatabase db=dbh.getWritableDatabase(); int num=0; switch(uriMatcher.match(uri)){ case 1: num=db.delete("userinfo",selection,selectionArgs); break; case 2: long id=ContentUris.parseId(uri); if(selection==null){ selection="_id="+id; } else{ selection="_id="+id+" and ("+selection+")"; } num=db.delete("userinfo",selection,selectionArgs); break; default: break; } getContext().getContentResolver().notifyChange(uri, null); return num; } //该方法用于供外部应用往ContentProvider添加数据 public Uri insert(Uri uri,ContentValues values){ SQLiteDatabase db=dbh.getWritableDatabase(); long id=db.insert("userinfo", null, values); if(id>-1)//插入数据成功 {//构建新插入行的Uri Uri insertUri=ContentUris.withAppendedId(CONTENT_URI, id); //通知所有的观察者,数据集已经改变 getContext().getContentResolver().notifyChange(insertUri, null); return insertUri; } return null; } //该方法用于供外部应用从ContentProvider中获取数据 public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder){ SQLiteDatabase db=dbh.getReadableDatabase(); Cursor cursor=null; switch(uriMatcher.match(uri)){ case 1: cursor=db.query("userinfo",//表名 null,//列的数组,null代表所有列 selection,//where条件 selectionArgs,//where条件的参数值的数组 null,//分组 null,//having sortOrder);//排序规则 break; case 2: long id=ContentUris.parseId(uri); if(selection==null){ selection="_id="+id; } else{ selection="_id="+id+" and ("+selection+")"; } cursor=db.query("userinfo", null, selection, selectionArgs, null, null, sortOrder); break; default: break; } return cursor; } //该方法用于供外部应用更新ContentProvider中的数据 public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs){ SQLiteDatabase db=dbh.getWritableDatabase(); int num=0; switch(uriMatcher.match(uri)){ case 1: num=db.update("userinfo",values,selection,selectionArgs); break; case 2: long id=ContentUris.parseId(uri); //在selection上增加条件_id=id if(selection==null){ selection="_id="+id; } else{ selection="_id="+id+" and ("+selection+")"; } num=db.update("userinfo",values,selection,selectionArgs); break; default: break; } getContext().getContentResolver().notifyChange(uri, null); return num; } } ``` AndroidManifest.xml ``` <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.example.definecontentprovider" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider tools:ignore="ExportedContentProvider" android:name="com.chapt6.UserProvider" android:authorities="com.chapt6.userprovider" android:exported="false"> </provider> </application> </manifest> ``` activity_main.xml ``` <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.definecontentprovider.MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout> ```
Android 使用下拉刷新框架(SmartRefreshLayout),报错Error inflating class
我是一名小白,在学习安卓,刚接触到导入外部的框架,看到github上的项目SmartRefreshLayout,就想试用一下,但配置好后一直闪退,报错日志:Unable to start activity ComponentInfo{com.zhang.hp.muke_test/com.zhang.hp.muke_test.MainActivity}: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class com.scwang.smartrefresh.layout.SmartRefreshLayout, xml文件写法: ``` <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <com.scwang.smartrefresh.layout.SmartRefreshLayout android:id="@+id/pull" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </com.scwang.smartrefresh.layout.SmartRefreshLayout> </androidx.constraintlayout.widget.ConstraintLayout> ``` MainActivity写法: ``` tv = findViewById(R.id.text); myrefresh = findViewById(R.id.pull); myrefresh.setOnRefreshListener(new OnRefreshListener() { //激活下拉刷新的时候调用的函数 @Override public void onRefresh(RefreshLayout refreshLayout) { tv.setText("下拉刷新了"); myrefresh.finishRefresh(); } }); myrefresh.setOnLoadMoreListener(new OnLoadMoreListener() { @Override public void onLoadMore(RefreshLayout refreshLayout) { tv.setText("上拉加载了"); myrefresh.finishLoadMore(); } }); myrefresh.setEnableLoadMore(true); myrefresh.autoRefresh(); ``` 不知道哪里出错了,希望各位大神能指导一下,谢谢了!
android 关于listview convertview的一些问题,求解!
![图片说明](https://img-ask.csdn.net/upload/201603/14/1457947694_116075.png) 做的是一个聊天界面,这是adapter代码。 运行时只能输入一次,输第二次时,参数convertview是第二次view的对象,不知道为什么啊。 ``` package com.example.chattest; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.Window; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; public class ChatActivity extends Activity implements OnClickListener { private Button btnSend; private ListView lvChat; private EditText etSendContent; //聊天内容的适配器 private ChatMsgViewAdapter chatMsgAdapter; //聊天内容 private List<ChatMsgInfo> chatMsgDataArrays = new ArrayList<ChatMsgInfo>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //不显示标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.chat); initView(); initData(); } //初始化视图 private void initView() { lvChat = (ListView) findViewById(R.id.chat_listview); btnSend = (Button) findViewById(R.id.btn_send); btnSend.setOnClickListener(this); etSendContent = (EditText) findViewById(R.id.et_sendmessage); } //聊天数据 //private final static int COUNT = 10 private String text = new String("第1种写法果然最慢,第二种写法由于用了StringBuffer,快了很多。奇怪的是" + "第4种写法竟然也很快,比用StringBuffer还快,怎么回事?其实慢,第二种写" + "法由于用了StringBuffer,快了很多。奇怪的是第4种写法竟然也很快,比用StringBuffer还快,怎" + "比用StringBuffer还快,怎么回事?其r还快,怎么回事?其回事?其如果你调试过字符串连接的执行过程就会知"); private String date = new String("2016-3-10 18:11"); //初始化数据 private void initData() { ChatMsgInfo msgExample = new ChatMsgInfo("XiaoMing", date, text, true); chatMsgDataArrays.add(msgExample); chatMsgAdapter = new ChatMsgViewAdapter(this, chatMsgDataArrays); //listview绑定adapter lvChat.setAdapter(chatMsgAdapter); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()) { case R.id.btn_send: send(); break; } } //发送按钮的响应函数 private void send() { //获取输入文本框内容 String sendContent = etSendContent.getText().toString(); if (sendContent.length() > 0) { ChatMsgInfo msg = new ChatMsgInfo("XiaoHong", getDate(), sendContent, false); chatMsgDataArrays.add(msg); //通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容。 Log.d("chattest", "after setchanged!"); chatMsgAdapter.notifyDataSetChanged(); etSendContent.setText(""); //定位到最后一行 Log.d("chattest", "after setSelection!"); lvChat.setSelection(lvChat.getCount() -1 ); } } //获取时间 private String getDate() { Calendar c = Calendar.getInstance(); String year = String.valueOf(c.get(Calendar.YEAR)); String month = String.valueOf(c.get(Calendar.MONTH)); String day = String.valueOf(c.get(Calendar.DAY_OF_MONTH) + 1); String hour = String.valueOf(c.get(Calendar.HOUR_OF_DAY)); String mins = String.valueOf(c.get(Calendar.MINUTE)); StringBuffer buffer = new StringBuffer(); buffer.append(year + "-" + month + "-" + day + " " + hour + ":" + mins); return buffer.toString(); } } ``` ``` package com.example.chattest; import java.util.List; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class ChatMsgViewAdapter extends BaseAdapter { private static final int TYPE_COM_MSG = 0; private static final int TYPE_TO_MSG = 1; //private static final int TAG_KEY_ITEM_TYPE = 0; //private static final int TAG_KEY_VIEWHOLDER = 1; private List<ChatMsgInfo> data;//数据list private LayoutInflater myInflater;//layout convert view对象 private Context context;//环境 //构造 public ChatMsgViewAdapter(Context context, List<ChatMsgInfo> data) { this.context = context; this.data = data; myInflater = LayoutInflater.from(context); } @Override public int getItemViewType(int position) { // TODO Auto-generated method stub ChatMsgInfo msg = data.get(position); if (msg.getMsgType()) { return TYPE_COM_MSG; } else { return TYPE_TO_MSG; } } @Override public int getViewTypeCount() { // TODO Auto-generated method stub return 2; } //获取ListView的个数 @Override public int getCount() { return data.size(); } //获取项 @Override public Object getItem(int position) { return data.get(position); } //获取项的id @Override public long getItemId(int position) { return position; } //获取view @Override public View getView(int position, View convertView, ViewGroup parent) { ChatMsgInfo chatMsg = data.get(position);//聊天数据 boolean isComMsg = chatMsg.getMsgType();//数据类型(发送、接收) LeftItemViewHolder leftViewHolder = null; RightItemViewHolder rightViewHolder = null; int viewType = getItemViewType(position); System.out.println(position + " " + convertView); if (convertView == null || ((Integer)convertView.getTag(R.id.tag_item_viewtype)) != viewType) { //区分消息类别,展示不同的界面 if (viewType == TYPE_COM_MSG) { convertView = myInflater.inflate(R.layout.chat_msg_text_left_item, null); leftViewHolder = new LeftItemViewHolder(); leftViewHolder.tvSendTime = (TextView) convertView.findViewById(R.id.tv_sendtime); leftViewHolder.tvUserName = (TextView) convertView.findViewById(R.id.tv_username); leftViewHolder.tvContent = (TextView) convertView.findViewById(R.id.tv_chatcontent); leftViewHolder.isComMsg = isComMsg; convertView.setTag(R.id.tag_item_viewholder, leftViewHolder); } else { convertView = myInflater.inflate(R.layout.chat_msg_text_right_item, null); rightViewHolder = new RightItemViewHolder(); rightViewHolder.tvSendTime = (TextView) convertView.findViewById(R.id.tv_sendtime); rightViewHolder.tvContent = (TextView) convertView.findViewById(R.id.tv_chatcontent); rightViewHolder.isComMsg = isComMsg; convertView.setTag(R.id.tag_item_viewtype, rightViewHolder); } convertView.setTag(R.id.tag_item_viewtype, viewType); } else { if (viewType == TYPE_COM_MSG) { leftViewHolder = (LeftItemViewHolder) convertView.getTag(R.id.tag_item_viewholder); } else { rightViewHolder = (RightItemViewHolder) convertView.getTag(R.id.tag_item_viewholder); } } if (viewType == TYPE_COM_MSG) { leftViewHolder.tvUserName.setText(chatMsg.getName()); leftViewHolder.tvSendTime.setText(chatMsg.getDate()); leftViewHolder.tvContent.setText(chatMsg.getText()); } else { rightViewHolder.tvSendTime.setText(chatMsg.getDate()); rightViewHolder.tvContent.setText(chatMsg.getText()); } System.out.println(position + " " + convertView); return convertView; } //保存项,显示项的内容 static class LeftItemViewHolder { public TextView tvSendTime; public TextView tvUserName; public TextView tvContent; public boolean isComMsg = true; } static class RightItemViewHolder { public TextView tvSendTime; public TextView tvContent; public boolean isComMsg = true; } } ```
自定义ContentProvider,书上这个代码怎么改?
DataBaseHelpe.java ``` package com.example.definecontentprovider; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class DataBaseHelpe extends SQLiteOpenHelper{ public static final String DB_NAME="userdb.db"; public static final String TABLENAME="userinfo"; public static final int DB_VERSION=1; public static final String CREATETABLE="create table"+TABLENAME+"(_id integer primary key,username text,userpassword text);"; public DataBaseHelpe(Context context) { super(context,DB_NAME,null,DB_VERSION); } public void onCreate(SQLiteDatabase db) { db.execSQL(CREATETABLE); } public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) { Log.i("Database update......","Update database from"+oldVersion+"to"+newVersion); db.execSQL("drop table if it exists"+TABLENAME); onCreate(db); } } ``` MainActivity.java ``` package com.example.definecontentprovider; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ContentResolver cr=getContentResolver(); //增加记录 ContentValues values=new ContentValues(); values.put("username","admin"); values.put("userpassword","123456"); cr.insert(UserProvider.CONTENT_URI, values); values.clear(); values.put("username","zhangsan"); values.put("userpassword","666666"); cr.insert(UserProvider.CONTENT_URI, values); //查询所有记录 Cursor cursor=cr.query(UserProvider.CONTENT_URI, null, null, null, null); Log.i("after inserted","-------------------------"); while(cursor.moveToNext()){ Log.i("after inserted","id:"+cursor.getString(0)+"username:"+cursor.getString(1)+"userpassword:"+cursor.getString(2)); } cursor.close(); //修改记录 values.clear(); values.put("username","lisi"); //构建的Uri为:"content://com.chapt6.userprovider/userinfo/2" Uri uri=ContentUris.withAppendedId(UserProvider.CONTENT_URI,2); //修改id为2的记录 cr.update(uri, values, null, null); //查询id为2的记录 cursor=cr.query(uri, null, null, null, null); Log.i("after updated","-------------------------"); while(cursor.moveToNext()){ Log.i("after updated","id:"+cursor.getString(0)+"username:"+cursor.getString(1)+"userpassword:"+cursor.getString(2)); } cursor.close(); //删除id为2的记录 cr.delete(uri, null, null); //查询记录 cursor=cr.query(UserProvider.CONTENT_URI, null, null, null, null); Log.i("after deleted","-------------------------"); while(cursor.moveToNext()){ Log.i("after deleted","id:"+cursor.getString(0)+"username:"+cursor.getString(1)+"userpassword:"+cursor.getString(2)); } cursor.close(); } @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; } @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(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } ``` UserProvider.java ``` package com.example.definecontentprovider; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; public class UserProvider extends ContentProvider{ private DataBaseHelper dbh=null; //发布Content Provider的Uri地址 private static final String AUTHORITY="com.chapt6.userprovider"; public static final Uri CONTENT_URI=Uri.parse("content://com.chapt6.userprovider/userinfo"); //注册需要匹配的Uri private static UriMatcher uriMatcher=new UriMatcher(UriMatcher.NO_MATCH); static { uriMatcher.addURI(AUTHORITY, "userinfo",1); uriMatcher.addURI(AUTHORITY, "userinfo/#",2); } //该方法在ContentProvider创建后就会被调用,在其他应用第一次访问它时才会被创建 public boolean onCreate(){ dbh=new DataBaseHelper(getContext()); return false; } //该方法用于返回当前Uri所代表数据的MIME类型 public String getType(Uri uri){ switch (uriMatcher.match(uri)){ case 1: return "vnd.android.cursor.dir/userinfo"; case 2: return "vnd.android.cursor.item/userinfo"; } return null; } //该方法用于供外部应用从ContentProvider删除数据 public int delete(Uri uri,String selection,String[] selectionArgs){ SQLiteDatabase db=dbh.getWritableDatabase(); int num=0; switch(uriMatcher.match(uri)){ case 1: num=db.delete("userinfo",selection,selectionArgs); break; case 2: long id=ContentUris.parseId(uri); if(selection==null){ selection="_id="+id; } else{ selection="_id="+id+" and ("+selection+")"; } num=db.delete("userinfo",selection,selectionArgs); break; default: break; } getContext().getContentResolver().notifyChange(uri, null); return num; } //该方法用于供外部应用往ContentProvider添加数据 public Uri insert(Uri uri,ContentValues values){ SQLiteDatabase db=dbh.getWritableDatabase(); long id=db.insert("userinfo", null, values); if(id>-1)//插入数据成功 {//构建新插入行的Uri Uri insertUri=ContentUris.withAppendedId(CONTENT_URI, id); //通知所有的观察者,数据集已经改变 getContext().getContentResolver().notifyChange(insertUri, null); return insertUri; } return null; } //该方法用于供外部应用从ContentProvider中获取数据 public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder){ SQLiteDatabase db=dbh.getReadableDatabase(); Cursor cursor=null; switch(uriMatcher.match(uri)){ case 1: cursor=db.query("userinfo",//表名 null,//列的数组,null代表所有列 selection,//where条件 selectionArgs,//where条件的参数值的数组 null,//分组 null,//having sortOrder);//排序规则 break; case 2: long id=ContentUris.parseId(uri); if(selection==null){ selection="_id="+id; } else{ selection="_id="+id+" and ("+selection+")"; } cursor=db.query("userinfo", null, selection, selectionArgs, null, null, sortOrder); break; default: break; } return cursor; } //该方法用于供外部应用更新ContentProvider中的数据 public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs){ SQLiteDatabase db=dbh.getWritableDatabase(); int num=0; switch(uriMatcher.match(uri)){ case 1: num=db.update("userinfo",values,selection,selectionArgs); break; case 2: long id=ContentUris.parseId(uri); //在selection上增加条件_id=id if(selection==null){ selection="_id="+id; } else{ selection="_id="+id+" and ("+selection+")"; } num=db.update("userinfo",values,selection,selectionArgs); break; default: break; } getContext().getContentResolver().notifyChange(uri, null); return num; } } ``` AndroidManifest.xml ``` <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.definecontentprovider" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:name=".UserProvider" android:authorities=".userprovider" android:exported="true"> </provider> </application> </manifest> ``` ![图片说明](https://img-ask.csdn.net/upload/201611/30/1480465682_288883.jpg) ![图片说明](https://img-ask.csdn.net/upload/201611/30/1480465698_552314.jpg) ![图片说明](https://img-ask.csdn.net/upload/201611/30/1480465719_835043.jpg)
RecycleView代码不更新!
RecycleView代码不更新!更新代码应该怎么写呢,有没有人教一下 网络数据取到了,Recycleview 没显示出来数据 ``` public class FoodFragment extends Fragment { public RecyclerView mFoodRecyclerView;//定义RecyclerView //定义以goodsentity实体类为对象的数据集合 private ArrayList<FoodEntity> goodsEntityList = new ArrayList<FoodEntity>(); //自定义recyclerveiw的适配器 private FoodRecycleAdapter mRecyclerAdapter; private JSONArray array; public FoodFragment() { } private static ChangeFoodFragment changeFoodFragment; public static FoodFragment newInstance(ChangeFoodFragment foodFragment){ changeFoodFragment = foodFragment; Bundle args = new Bundle(); FoodFragment fragment = new FoodFragment(); fragment.setArguments(args); return fragment; } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.recyclerview_food, container, false); //对recycleview进行配置 return view; } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); initData(); initRecyclerView(view); } private void initData() { new Thread(){ public void run() { String url = DocUtil.food_list; OkHttpClient okHttpClient = new OkHttpClient(); String token= CacheUtils.getString(getActivity(), "token", ""); RequestBody body = new FormBody.Builder() .add("token",token) .build(); Request request = new Request.Builder() .url(url) .post(body) .build(); Call call = okHttpClient.newCall(request); try { Response response = call.execute(); //System.out.println(response.body().string()); try { final String string=response.body().string(); final JSONObject object=new JSONObject(string); array=object.getJSONArray("list"); System.out.println(array); if(array.length()>0) { try { FoodEntity foodEntity =new FoodEntity(); for(int i=0;i<array.length();i++){ JSONObject object1=array.getJSONObject(i); foodEntity.setFoodtitle(object1.getString("foodtitle")); foodEntity.setFoodcontent(object1.getString("foodcontent")); foodEntity.setFoodcontentimg(object1.getString("foodcontentimg")); System.out.println(object1.getString("foodtitle")); System.out.println(object1.getString("foodcontent")); System.out.println(object1.getString("foodcontentimg")); } } catch (Exception e) { e.printStackTrace(); } }else { Toast.makeText(getActivity(), "无数据", Toast.LENGTH_SHORT).show(); } } catch (JSONException e) { e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } } }.start(); // for (int i=0;i<10;i++){ // FoodEntity foodEntity =new FoodEntity(); // foodEntity.setName("模拟数据FOOD"+i); // foodEntity.setContent("100"+i); // goodsEntityList.add(foodEntity); // } } private void initRecyclerView(View view) { //获取RecyclerView mFoodRecyclerView=view.findViewById(R.id.food_recyclerView); //创建adapter mRecyclerAdapter = new FoodRecycleAdapter(getActivity(), goodsEntityList); //给RecyclerView设置adapter mFoodRecyclerView.setAdapter( mRecyclerAdapter ); //设置layoutManager,可以设置显示效果,是线性布局、grid布局,还是瀑布流布局 //参数是:上下文、列表方向(横向还是纵向)、是否倒叙 mFoodRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false)); //设置item的分割线 mFoodRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),DividerItemDecoration.VERTICAL)); //RecyclerView中没有item的监听事件,需要自己在适配器中写一个监听事件的接口。参数根据自定义 mRecyclerAdapter.setOnItemClickListener(new FoodRecycleAdapter.OnItemClickListener() { @Override public void OnItemClick(View view, FoodEntity data) { Toast.makeText(getActivity(),"我是item",Toast.LENGTH_SHORT).show(); changeToAnotherFragment(); } }); } @SuppressLint("ResourceType") private void changeToAnotherFragment() { changeFoodFragment.changeFoodFragment(); } } ``` ``` public class FoodRecycleAdapter extends RecyclerView.Adapter<FoodRecycleAdapter.myViewHodler>{ private Context context; private ArrayList<FoodEntity> goodsEntityList; private ImageLoaderConfiguration configuration; public DisplayImageOptions imageOptions; private FoodRecycleAdapter adapter; //创建构造函数 public FoodRecycleAdapter(Context context, ArrayList<FoodEntity> goodsEntityList) { //将传递过来的数据,赋值给本地变量 this.context = context;//上下文 this.goodsEntityList = goodsEntityList;//实体类数据ArrayList } /** * 创建viewhodler,相当于listview中getview中的创建view和viewhodler * * @param parent * @param viewType * @return */ @Override public myViewHodler onCreateViewHolder(ViewGroup parent, int viewType) { //创建自定义布局 View itemView = View.inflate(context, R.layout.food_item, null); return new myViewHodler(itemView); } /** * 绑定数据,数据与view绑定 * * @param holder * @param position */ @Override public void onBindViewHolder(myViewHodler holder, int position) { //根据点击位置绑定数据 FoodEntity data = goodsEntityList.get(position); // holder.mItemGoodsImg; configuration = ImageLoaderConfiguration.createDefault(context); ImageLoader.getInstance().init(configuration); imageOptions = DisplayImageOptions.createSimple(); holder.mItemGoodsName.setText(data.foodtitle);//获取实体类中的name字段并设置 holder.mItemContent.setText(data.foodcontent);//获取实体类中的price字段并设置 adapter=new FoodRecycleAdapter(context, goodsEntityList); adapter.notifyItemRangeInserted(position,getItemCount()); // ImageLoader.getInstance().displayImage(DocUtil.base_url+ // data.foodcontentimg, mItemGoodsImg, // imageOptions); } /** * 得到总条数 * * @return */ @Override public int getItemCount() { return goodsEntityList.size(); } //自定义viewhodler class myViewHodler extends RecyclerView.ViewHolder { private ImageView mItemGoodsImg; private TextView mItemGoodsName; private TextView mItemContent; public myViewHodler(View itemView) { super(itemView); mItemGoodsImg = itemView.findViewById(R.id.food_img); mItemGoodsName = itemView.findViewById(R.id.food_title); mItemContent = itemView.findViewById(R.id.tx_content); //点击事件放在adapter中使用,也可以写个接口在activity中调用 //方法一:在adapter中设置点击事件 itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //可以选择直接在本位置直接写业务处理 //Toast.makeText(context,"点击了xxx",Toast.LENGTH_SHORT).show(); //此处回传点击监听事件 if(onItemClickListener!=null){ onItemClickListener.OnItemClick(v, goodsEntityList.get(getLayoutPosition())); } } }); } } /** * 设置item的监听事件的接口 */ public interface OnItemClickListener { /** * 接口中的点击每一项的实现方法,参数自己定义 * * @param view 点击的item的视图 * @param data 点击的item的数据 */ public void OnItemClick(View view, FoodEntity data); } //需要外部访问,所以需要设置set方法,方便调用 private FoodRecycleAdapter.OnItemClickListener onItemClickListener; public void setOnItemClickListener(FoodRecycleAdapter.OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } } ```
recycview中添加底部按钮问题。
我就想在这个recycview中底部添加两个按钮 项目地址链接: https://pan.baidu.com/s/13EzJZ8CrRL6xRiFjUxJXqw 提取码: qjet ![图片说明](https://img-ask.csdn.net/upload/201903/14/1552547394_832120.png) ``` public class CollectFragment extends Fragment { public RecyclerView mCollectRecyclerView;//定义RecyclerView //定义以goodsentity实体类为对象的数据集合 private ArrayList<GoodsEntity> goodsEntityList = new ArrayList<GoodsEntity>(); //自定义recyclerveiw的适配器 private CollectRecycleAdapter mCollectRecyclerAdapter; private static ChangeFragment mChange; public static CollectFragment newInstance(ChangeFragment changeFragment) { mChange = changeFragment; Bundle args = new Bundle(); CollectFragment fragment = new CollectFragment(); fragment.setArguments(args); return fragment; } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { //获取fragment的layout View view = inflater.inflate(R.layout.recyclerview, container, false); //对recycleview进行配置 return view; } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); initRecyclerView(view); //模拟数据 initData(); } /** * TODO 模拟数据 */ private void initData() { for (int i=0;i<10;i++){ GoodsEntity goodsEntity=new GoodsEntity(); goodsEntity.setGoodsName("模拟数据"+i); goodsEntity.setGoodsPrice("100"+i); goodsEntityList.add(goodsEntity); } } /** * TODO 对recycleview进行配置 */ private void initRecyclerView(View view) { //获取RecyclerView mCollectRecyclerView=view.findViewById(R.id.collect_recyclerView); //创建adapter mCollectRecyclerAdapter = new CollectRecycleAdapter(getActivity(), goodsEntityList); //给RecyclerView设置adapter mCollectRecyclerView.setAdapter(mCollectRecyclerAdapter); //设置layoutManager,可以设置显示效果,是线性布局、grid布局,还是瀑布流布局 //参数是:上下文、列表方向(横向还是纵向)、是否倒叙 mCollectRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false)); //设置item的分割线 mCollectRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),DividerItemDecoration.VERTICAL)); //RecyclerView中没有item的监听事件,需要自己在适配器中写一个监听事件的接口。参数根据自定义 mCollectRecyclerAdapter.setOnItemClickListener(new CollectRecycleAdapter.OnItemClickListener() { @Override public void OnItemClick(View view, GoodsEntity data) { //此处进行监听事件的业务处理 Toast.makeText(getActivity(),"我是item",Toast.LENGTH_SHORT).show(); mChange.changeAttractionsContent(); } }); } } ``` ``` public class CollectRecycleAdapter extends RecyclerView.Adapter<CollectRecycleAdapter.myViewHodler> { private Context context; private ArrayList<GoodsEntity> goodsEntityList; //创建构造函数 public CollectRecycleAdapter(Context context, ArrayList<GoodsEntity> goodsEntityList) { //将传递过来的数据,赋值给本地变量 this.context = context;//上下文 this.goodsEntityList = goodsEntityList;//实体类数据ArrayList } /** * 创建viewhodler,相当于listview中getview中的创建view和viewhodler * * @param parent * @param viewType * @return */ @Override public myViewHodler onCreateViewHolder(ViewGroup parent, int viewType) { //创建自定义布局 View itemView = View.inflate(context, R.layout.item_content, null); return new myViewHodler(itemView); } /** * 绑定数据,数据与view绑定 * * @param holder * @param position */ @Override public void onBindViewHolder(myViewHodler holder, int position) { //根据点击位置绑定数据 GoodsEntity data = goodsEntityList.get(position); // holder.mItemGoodsImg; holder.mItemGoodsName.setText(data.goodsName);//获取实体类中的name字段并设置 holder.mItemGoodsPrice.setText(data.goodsPrice);//获取实体类中的price字段并设置 } /** * 得到总条数 * * @return */ @Override public int getItemCount() { return goodsEntityList.size(); } //自定义viewhodler class myViewHodler extends RecyclerView.ViewHolder { private ImageView mItemGoodsImg; private TextView mItemGoodsName; private TextView mItemGoodsPrice; public myViewHodler(View itemView) { super(itemView); mItemGoodsImg = itemView.findViewById(R.id.tx_news_simple_photos_01); mItemGoodsName = itemView.findViewById(R.id.tx_news_simple_photos_title); mItemGoodsPrice = itemView.findViewById(R.id.tx_news_simple_photos_time); //点击事件放在adapter中使用,也可以写个接口在activity中调用 //方法一:在adapter中设置点击事件 itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //可以选择直接在本位置直接写业务处理 //Toast.makeText(context,"点击了xxx",Toast.LENGTH_SHORT).show(); //此处回传点击监听事件 if(onItemClickListener!=null){ onItemClickListener.OnItemClick(v, goodsEntityList.get(getLayoutPosition())); } } }); } } /** * 设置item的监听事件的接口 */ public interface OnItemClickListener { /** * 接口中的点击每一项的实现方法,参数自己定义 * * @param view 点击的item的视图 * @param data 点击的item的数据 */ public void OnItemClick(View view, GoodsEntity data); } //需要外部访问,所以需要设置set方法,方便调用 private OnItemClickListener onItemClickListener; public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } } ```
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
使用 Docker 部署 Spring Boot 项目
Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下。首先构建一个简单的 S...
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
redis分布式锁,面试官请随便问,我都会
文章有点长并且绕,先来个图片缓冲下! 前言 现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式、高并发已经是业务要求的常态。像腾讯系的不少服务,还有CDN优化、异地多备份等处理。 说到分布式,就必然涉及到分布式锁的概念,如何保证不同机器不同线程的分布式锁同步呢? 实现要点 互斥性,同一时刻,智能有一个客户端持有锁。 防止死锁发生,如果持有锁的客户端崩溃没有主动释放锁,也要保证锁可以正常释...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
Android 9.0 init 启动流程
阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android本篇文章主要介绍Android开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:一、启动流程概述一、 启动流程概述Android启动流程跟Linux启动类似,大致分为如下五个阶段。1.开机上电,加载固化的ROM。2.加载BootLoader,拉起Android OS。3.加载Uboot,初始外设,引导Kernel启动等。...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车?某胡同口的煎饼摊一年能卖出多少个煎饼?深圳有多少个产品经理?一辆公交车里能装下多少个乒乓球?一个正常成年人有多少根头发?这类估算问题,被称为费米问题,是以科学家费米命名的。为什么面试会问这种问题呢?这类问题能把两类人清楚地区分出来。一类是具有文科思维的人,擅长赞叹和模糊想象,它主要依靠的是人的第一反应和直觉,比如小孩...
前后端分离,我怎么就选择了 Spring Boot + Vue 技术栈?
前两天又有小伙伴私信松哥,问题还是职业规划,Java 技术栈路线这种,实际上对于这一类问题我经常不太敢回答,每个人的情况都不太一样,而小伙伴也很少详细介绍自己的情况,大都是一两句话就把问题抛出来了,啥情况都不了解,就要指出一个方向,这实在是太难了。 因此今天我想从我学习 Spring Boot + Vue 这套技术栈的角度,来和大家聊一聊没有人指导,我是如何一步一步建立起自己的技术体系的。 线上大...
17张图带你解析红黑树的原理!保证你能看懂!
二叉查找树 由于红黑树本质上就是一棵二叉查找树,所以在了解红黑树之前,咱们先来看下二叉查找树。 二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 若任意结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若任意结点的...
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。 背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法 不过,当我看了源代码之后 这程序不到50行 尽管我有多年的Python经验,但我竟然一时也没有看懂 当然啦,原作者也说了,这个代码也是在无聊中诞生的,平时撸码是不写中文变量名的, 中文...
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的回答,对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalking,作者吴晟、刘浩杨 等等 仓库地址: apache/skywalking 更...
MySQL数据库总结
一、数据库简介 数据库(Database,DB)是按照数据结构来组织,存储和管理数据的仓库。 典型特征:数据的结构化、数据间的共享、减少数据的冗余度,数据的独立性。 关系型数据库:使用关系模型把数据组织到数据表(table)中。现实世界可以用数据来描述。 主流的关系型数据库产品:Oracle(Oracle)、DB2(IBM)、SQL Server(MS)、MySQL(Oracle)。 数据表:数...
记一次腾讯面试:进程之间究竟有哪些通信方式?如何通信? ---- 告别死记硬背
有一次面试的时候,被问到进程之间有哪些通信方式,不过由于之前没深入思考且整理过,说的并不好。想必大家也都知道进程有哪些通信方式,可是我猜很多人都是靠着”背“来记忆的,所以今天的这篇文章,讲给大家详细着讲解他们是如何通信的,让大家尽量能够理解他们之间的区别、优缺点等,这样的话,以后面试官让你举例子,你也能够顺手拈来。 1、管道 我们来看一条 Linux 的语句 netstat -tulnp | gr...
相关热词 c# clr dll c# 如何orm c# 固定大小的字符数组 c#框架设计 c# 删除数据库 c# 中文文字 图片转 c# 成员属性 接口 c#如何将程序封装 16进制负数转换 c# c#练手项目
立即提问